2012-08-17 2 views
6

doubleの配列を既存のMatrixXd構造にマップする必要があります。これまでは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

このマップの機能は何ですか?それを見せてもらえますか? –

+0

それは私が知っているすべてです。http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

答えて

13

私はあなたが何を望んでいるかわかりませんが、私は説明しようとします。

あなたのコードにはdoubleとfloatが混在しています(MatrixXfはすべてのエントリがfloat型の行列です)。私は間違いなくあなたがどこにいてもダブルを使いたいと思っていると思います。これが本当にあなたの意図であったかどうかについては、以下を参照してください。

命令Map<MatrixXd>(arrayd, n, n) = matrixは、matrixのエントリをarraydにコピーします。 matrix = Map<MatrixXd>(arrayd, n, n):それはmatrixarraydのエントリをコピーするには、ループ

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

に相当し、あなたは逆の割り当てを使用します。マトリックス内のエントリに

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を2倍の配列にコピーする場合は、明示的にキャストを含める必要があります。このためのEigenの構文は、Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()です。

+0

フロートとダブルとの混乱については残念です。今更新されました! – Manolete

+0

これはとても良い説明です。まったく新しいデータがarraydにコピーされたらどうなりますか?このデータはマトリックスでも共有されますか?考え方はGPUにarraydを送り、計算してCPUに戻すことです。MatrixXdにデータがあります – Manolete

+0

@Manoleteはい、うまくいくはずです –

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] 
関連する問題