Подтвердить что ты не робот

Преобразование матрицы Eigen Matrix в C

Библиотека Eigen позволяет сопоставить существующую память с Eigen-матрицами.

float array[3];
Map<Vector3f>(array, 3).fill(10);
int data[4] = 1, 2, 3, 4;
Matrix2i mat2x2(data);
MatrixXi mat2x2 = Map<Matrix2i>(data);
MatrixXi mat2x2 = Map<MatrixXi>(data, 2, 2);

Мой вопрос в том, как мы можем получить массив c (например, float [] a) из собственной матрицы (например, Matrix3f m)? Какая это реальная компоновка собственной матрицы? Являются ли реальные данные сохраненными как в обычном массиве c?

4b9b3361

Ответ 1

Вы можете использовать функцию member() члена класса Eigen Matrix. Макет по умолчанию имеет размер столбца, а не row-major, как многомерный массив C (макет можно выбрать при создании объекта Matrix). Для разреженных матриц предыдущее предложение явно не применяется.

Ответ 2

Чтобы преобразовать обычный тип данных в собственный тип матрицы

  double *X; // non-NULL pointer to some data

Вы можете создать двойную матрицу размера nRows x nCols, используя следующие функции Map:

  MatrixXd eigenX = Map<MatrixXd>( X, nRows, nCols );

Преобразование собственного матричного типа в обычный тип данных

  MatrixXd resultEigen;   // Eigen matrix with some result (non NULL!)
  double *resultC;        // NULL pointer <-- WRONG INFO from the site. resultC must be preallocated!
  Map<MatrixXd>( resultC, resultEigen.rows(), resultEigen.cols() ) =   resultEigen;

Таким образом вы можете войти и выйти из собственной матрицы. Полные кредиты идут на http://dovgalecs.com/blog/eigen-how-to-get-in-and-out-data-from-eigen-matrix/

Ответ 4

Решение с Map над segfaults при попытке (см. комментарий выше).

Вместо этого здесь решение, которое работает для меня, копирует данные в std::vector из Eigen:: Matrix. Я предварительно выделяю пространство в векторе для сохранения результата карты/копии.

Eigen::MatrixXf m(2, 2);
m(0, 0) = 3;
m(1, 0) = 2.5;
m(0, 1) = -1;
m(1, 1) = 0;

cout << m << "\n";

// Output:
//    3  -1
// 2.5   0

// Segfaults with this code: 
//
// float* p = nullptr;
// Eigen::Map<Eigen::MatrixXf>(p, m.rows(), m.cols()) = m;

// Better code, which also copies into a std::vector:

// Note that I initialize vec with the matrix size to begin with:
std::vector<float> vec(m.size());
Eigen::Map<Eigen::MatrixXf>(vec.data(), m.rows(), m.cols()) = m;

for (const auto& x : vec)
  cout << x << ", ";
  cout << "\n";

// Output: 3, 2.5, -1, 0

Ответ 5

ComplexEigenSolver < MyMatrix > es;
complex<double> *eseig;
es.compute(H);
es.eigenvalues().transpose();
eseig=(complex<double> *)es.eigenvalues().data();