我无法弄清楚是否以及如何将二维双数组映射到Eigen :: Matrix。
是否可以将我收到的数组double d[][]
映射为Eigen :: Matrix?
虽然一维数组工作正常,但我无法将double** p
映射到p
。这可能吗?怎么可能呢?大小Eigen::Map<Eigen::Matrix<double, n, n>>
并不是真正的常量,但我可以接受硬编码大小。
我尝试了几个版本,但没有一个版本。我认为以下内容应该有效(假设n
的大小为4)。
n
代码编译并运行,但只有第一列的元素和第二列的第一个元素映射正确的值。使用Eigen::Map<Eigen::Matrix<double, 4, 4>> p_OUTPUT(&p[0][0]);
作为参数会产生相同的结果。
我试过的其他版本(例如没有p[0]
)没有编译。
答案 0 :(得分:3)
为了完整起见,我找到了解决方案。如上所述here或here,存储在不连续的内存中就是问题。
以下解决方案对我有用。
Eigen::MatrixXd ConvertToEigenMatrix(std::vector<std::vector<double>> data)
{
Eigen::MatrixXd eMatrix(data.size(), data[0].size());
for (int i = 0; i < data.size(); ++i)
eMatrix.row(i) = Eigen::VectorXd::Map(&data[i][0], data[0].size());
return eMatrix;
}
答案 1 :(得分:0)
你给自己的答案有点线索:默认情况下,Eigen以列主格式存储矩阵,意味着来自这个矩阵的元素:
m(0,0) m(0,1) m(0,2)
m(1,0) m(1,1) m(1,2)
m(2,0) m(2,1) m(2,2)
存储在一个大的线性数组中:
[m(0,0), m(1,0), m(2,0), m(0,1), m(1,1), m(2,1), m(0,2), m(1,2), m(2,2)]
您的数据(根据您的回答判断)采用行主格式,这就是您从数组中提取内存连续行并将其分配到结果中的行的原因。您可以告诉Map
您的数据是RowMajor
格式,并且应该正确读取您的数据:
Eigen::Map<Eigen::Matrix<double, 4, 4, Eigen::RowMajor>> p_OUTPUT(p);