将Eigenmatrix转换为C数组
特征库可以将现有的内存映射到特征matrix。
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);
我的问题是,如何从特征matrix(如Matrix3f m)获得c数组(例如float [] a)? 什么是特征matrix的真正布局? 真正的数据存储在正常的C数组?
您可以使用Eigen Matrix类的data()成员函数。 默认情况下,布局是作为多维C数组的列主要布局,而不是主要布局(可以在创buildMatrix对象时select布局)。 对于稀疏matrix,前面的句子显然不适用。
将普通数据types转换为特征matrixtypes
double *X; // non-NULL pointer to some data
您可以使用Mapfunction创build一个nRows x nCols大小的双重matrix,如下所示:
MatrixXd eigenX = Map<MatrixXd>( X, nRows, nCols );
将特征matrixtypes转换为正常的数据types
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;
这样你就可以进出特征matrix。 完整的学分去http://dovgalecs.com/blog/eigen-how-to-get-in-and-out-data-from-eigen-matrix/
您需要再次使用Map函数。 请看这里的例子: http : //forum.kde.org/viewtopic.php?f=74&t=95457
ComplexEigenSolver < MyMatrix > es; complex<double> *eseig; es.compute(H); es.eigenvalues().transpose(); eseig=(complex<double> *)es.eigenvalues().data();
上面的Map解决scheme,当我尝试它时(请参阅上面的评论)。
相反,这是一个适合我的解决scheme,将数据从Eigen :: Matrix复制到std :: vector中。 我预先在向量中分配空间来存储Map / Copy的结果。
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