将二维数组映射到Eigen :: Matrix

时间:2016-11-09 15:08:00

标签: c++ eigen

我无法弄清楚是否以及如何将二维双数组映射到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])没有编译。

2 个答案:

答案 0 :(得分:3)

为了完整起见,我找到了解决方案。如上所述herehere,存储在不连续的内存中就是问题。

以下解决方案对我有用。

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);