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

Posted

技术标签:

【中文标题】将二维数组映射到 Eigen::Matrix【英文标题】:Map two-dimensional array to Eigen::Matrix 【发布时间】:2016-11-09 15:08:00 【问题描述】:

我不知道是否以及如何将二维双精度数组映射到 Eigen::Matrix。 是否可以将我收到的 double** p 数组 double d[][] 映射到 Eigen::Matrix?

虽然一维数组可以正常工作,但我无法将 p 映射到 Eigen::Map<Eigen::Matrix<double, n, n>>。这可能吗?怎么可能? n 的大小并不是固定不变的,但我可以接受硬编码的大小。


我尝试了几个版本,但都没有奏效。我认为以下应该可以工作(假设大小 n 为 4)。

Eigen::Map<Eigen::Matrix<double, 4, 4>> p_OUTPUT(&p[0][0]);

代码编译并运行,但只有第一列的元素和第二列的第一个元素映射了正确的值。使用 p[0] 作为参数会产生相同的结果。 我试过的其他版本(例如没有&amp;)没有编译。

【问题讨论】:

你能展示你尝试了什么以及你想要实现什么吗? n 是编译时间常数吗?你确定pdouble** @AviGinsburg 感谢您的回复,我完成了我的问题。 n 的大小不是一个常数,但硬编码大小就可以了。是的,我很确定pdouble**,因为p[row][col] += ... 有效。 见this 帖子。 @AviGinsburg 非常感谢,我在链接的帖子中支持您的回答!就在此时,我找到了一个非常相似的解决方案。 【参考方案1】:

为了完整起见,我找到了解决方案。正如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;

【讨论】:

【参考方案2】:

您给自己的答案是一种线索:默认情况下,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);

【讨论】:

不,您假设p 指向内存的连续部分。对于无法保证的double** 原来的问题是double[][]作为double**传递给函数;如果它被声明为一个数组,那么它将在内存中是连续的。

以上是关于将二维数组映射到 Eigen::Matrix的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 将对象映射到二维数组

对齐数据类型 Eigen::Matrix 的数组或向量声明

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

将二维数组的每个元素映射到python中对应的(x,y)坐标

算法题摘录一

水文日常~~将数据归一化映射到任意区间(附二维数组归一化的Python实现)