8

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

}
4

2 に答える 2

14

何が欲しいのかわかりませんが、説明しようと思います。

コード内でdoubleとfloatを混合しています(MatrixXfは、すべてのエントリがfloatである行列です)。今のところ、これは意図しないamdであり、どこでもdoubleを使用したいと思います。これが本当にあなたの意図であったかどうかについては、以下を参照してください。

命令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);

のエントリをにコピーするにarraydmatrix、逆の割り当てを使用しますmatrix = Map<MatrixXd>(arrayd, n, n)

ただし、通常は次の手法の方が便利です。

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

これで、arrayedはマトリックス内のエントリを指し、任意のC++配列として処理できます。matrixデータはとの間で共有されるarraydため、最後に何もコピーする必要はありません。ちなみに、関数は行列に格納されているためn、関数に渡す必要はありません。foo()matrix.rows()とmatrix.cols()を使用して、その値を照会します。

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

于 2012-08-17T14:33:37.317 に答える
12

逆の操作を行う必要はありません。

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]
于 2013-06-11T08:57:12.803 に答える