何が欲しいのかわかりませんが、説明しようと思います。
コード内で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);
のエントリをにコピーするにarrayd
はmatrix
、逆の割り当てを使用します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>()
です。