将行优先数组映射到列优先特征矩阵
Posted
技术标签:
【中文标题】将行优先数组映射到列优先特征矩阵【英文标题】:Mapping row-major array to column-majored Eigen Matrix 【发布时间】:2016-12-06 10:23:30 【问题描述】:我想从 C 类型数组映射到以列为主的特征矩阵。
映射本身使用的是 RowMajor 类型,
所以我尝试了
std::vector<double> a(9);
double *p= a.data();
Eigen::MatrixXd M=Eigen::Map<Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>(p)
我得到了我所期望的(M.data() 的顺序),但是,如果在编译时模板中的维度 (3) 未知,则此方法不起作用...任何解决方案?
【问题讨论】:
@AviGinsburg 那是正确的解决方案,除了在这种情况下您还需要传递行数和列数(不仅仅是指针)。通常,为Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
创建一个typedef
以提高可读性是有意义的。
@chtz,我知道,我想听听 OP 的意思
@AviGinsburg 表示行和列不是常数,它适用于 Eigen::MatrixXd M=Eigen::Map<:matrixxcd>(p, row, col),但后来我无法更改 colmajor
【参考方案1】:
我假设你写的是:
Eigen::MatrixXd M=Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(p);
这不会让地图知道尺寸应该是什么。您必须在构造函数中添加它:
std::vector<double> a1,2,3,4,5,6,7,8,9;
double *p = a.data();
std::cout << Eigen::Map<Eigen::Matrix<double, 3, 3, Eigen::RowMajor>>(p) << "\n\n";
std::cout << Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(p, 3, 3) << "\n\n";
std::cout << Eigen::Map<Eigen::Matrix<double, 3, 3, Eigen::ColMajor>>(p) << "\n\n";
std::cout << Eigen::Map<Eigen::MatrixXd>(p, 3, 3) << "\n\n";
【讨论】:
所以,我应该写 Eigen::Map<:matrix eigen::dynamic eigen::rowmajor>>(p, row, col),如果行和列在编译时是未知的? 是的。您可能想接受chtz's 建议 re: typedef 以提高可读性。以上是关于将行优先数组映射到列优先特征矩阵的主要内容,如果未能解决你的问题,请参考以下文章