2016-11-09 515 views
2

我无法弄清楚是否以及如何将一个二维双数组映射到Eigen :: Matrix。 是否可以将我以double** p收到的数组double d[][]映射到Eigen :: Matrix?将二维数组映射到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]作为参数产生相同的结果。 我试过的其他版本(例如没有&)没有编译。

+0

你能告诉你试过,你想达到什么目的? 'n'是编译时间常量吗?你确定'P'是一个'双**'吗? –

+0

@AviGinsburg感谢您的回复,我完成了我的问题。大小'n'不是一个常数,但硬编码的大小是可以的。 是的,我很确定'p'是一个'double **',因为'p [row] [col] + = ...'起作用。 – AnBr

+0

请参阅[本](http://stackoverflow.com/a/33669013/2899559)文章。 –

回答

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; 
} 
0

你给自己的答案是怎样的一个线索:本征,默认情况下,存储在列优先格式矩阵,这意味着从这个矩阵的元素:

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

不,你认为'p'指向连续的一段内存。对于没有保证的双**。 –

+0

最初的问题是它是一个'double [] []'作为'double **'传递给函数;如果它被声明为一个数组,那么它将在内存中连续。 –