Преобразование матрицы 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?
Ответы
Ответ 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/
Ответ 3
Вам нужно снова использовать функцию "Карта". См. Пример здесь:
http://forum.kde.org/viewtopic.php?f=74&t=95457
Ответ 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();