2012-08-17 70 views
6

我想將double數組映射到現有的MatrixXd結構。到目前爲止,我已經設法將Eigen矩陣映射到一個簡單的數組,但是我找不到實現它的方法。將數組映射回現有的Eigen矩陣

void foo(MatrixXd matrix, int n){ 

double arrayd = new double[n*n]; 
// map the input matrix to an array 
Map<MatrixXd>(arrayd, n, n) = matrix; 

    //do something with the array 
      ....... 
// map array back to the existing matrix 

} 
+1

這是什麼地圖<>功能?你能證明嗎? – 2012-08-17 10:13:13

+0

這就是我所知道的http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete 2012-08-17 10:17:44

回答

13

我不確定你想要什麼,但我會嘗試解釋。

您在代碼中混合了double和float(MatrixXf是一個矩陣,其中每個條目都是一個float)。目前我會假設這是無意的,你想在任何地方使用雙重的;請參閱下文,瞭解這是否真的是您的意圖。

指令Map<MatrixXd>(arrayd, n, n) = matrix將條目matrix複製到arrayd。它相當於環

for (int i = 0; i < n; ++i) 
    for (int j = 0; j < n; ++j) 
     arrayd[i + j*n] = matrix(i, j); 

arrayd條目複製到matrix,你可以使用逆分配:matrix = Map<MatrixXd>(arrayd, n, n)

然而,通常可以採用以下的技術是更加有用:

void foo(MatrixXd matrix, int n) { 
    double* arrayd = matrix.data(); 
    // do something with the array 
} 

現在arrayd點矩陣中的條目,並可以處理它作爲任何C++陣列。數據在matrixarrayd之間共享,因此您不必在最後複製任何內容。順便說一下,您不需要將n傳遞給函數foo(),因爲它存儲在矩陣中;使用matrix.rows()和matrix.cols()來查詢它的值。

如果您確實想將MatrixXf複製到雙精度數組中,那麼您需要明確包含該精度。 Eigen中的語法是:Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()

+0

對於浮點和雙精度混淆抱歉。現在更新! – Manolete 2012-08-17 16:04:54

+0

這是一個很好的解釋。如果全新的數據被複制到arrayd中會怎麼樣?這些數據是否也將在矩陣中共享?這個想法是發送arrayd到一個GPU,進行計算,並返回到CPU有數據到一個MatrixXd – Manolete 2012-08-17 16:11:52

+0

@ Manolete是的,這應該工作 – 2012-08-19 15:12:18

8

你不需要做任何反向操作。

當使用Eigen :: Map時,您將原始數組映射到Eigen類。 這意味着您現在可以使用Eighen函數來讀取或寫入它。

如果您修改映射陣列,則更改已經存在。您可以簡單地訪問原始數組。

float buffer[16]; //a raw array of float 

//let's map the array using an Eigen matrix 
Eigen::Map<Eigen::Matrix4f> eigenMatrix(buffer); 

//do something on the matrix 
eigenMatrix = Eigen::Matrix4f::Identity(); 


//now buffer will contain the following values 
//buffer = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]