将行优先数组映射到列优先特征矩阵

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&lt;double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor&gt; 创建一个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 以提高可读性。

以上是关于将行优先数组映射到列优先特征矩阵的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-特殊矩阵的压缩存储

从具有行主顺序的数组创建特征矩阵

从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制

王道数据结构与算法特殊矩阵的压缩存储

C语言数组为啥按行优先存储

文本左右对齐(字符串模拟)螺旋矩阵 II(数组矩阵)二叉树中的最大路径和(树深度优先搜索)