2016-11-09 510 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 **'傳遞給函數;如果它被聲明爲一個數組,那麼它將在內存中連續。 –