2012-11-23 8 views
7

最近、Eigenライブラリを使用し始めました。私はEigen行列をC/C++配列にマッピングする問題を持っています。 Eigen行列は、デフォルトで列を前提としています。私はC/C++配列にマトリクスをマッピングするために、次のコードを使用する場合、固有ベクトルをC配列にマップする

double a[10]; 
double *p = &a[0]; 
MatrixXd(2,5) m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
cout<<m<<endl; 
Eigen::Map<MatrixXd>(p,2,5) = m; 
for (int i=0; i<10; i++) 
    cout<<a[i]<<" "; 
cout<<endl; 

出力である:私が変更した場合

0 1 2 3 4 
1 2 3 4 5 
0 1 1 2 2 3 3 4 4 5 

列としてMの定義は、専攻:

Matrix <double,2,5,RowMajor> m; 

私は、出力は次のようになります予想:

0 1 2 3 4 
1 2 3 4 5 
0 1 2 3 4 1 2 3 4 5 

しかし、実際には結果はまだ最初のものと同じでした。私の質問は、配列のデータが行に基づいているようにC/C++配列にEigen行列をマップする方法はありますか?

は、私は望ましい結果を得るためにmatrix.data()memember機能を使用できることがわかったが、私はこの使用マップ行うことができるかどうか思ったんだけど:

使用matrix.dataを()作品:

double a[10]; 
double *p = &a[0]; 
Matrix <double,2,5,RowMajor> m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
double *p1 = m.data(); 
for (int i=0; i<10; i++) 
    cout<<p1[i]<<" "; 
cout<<endl; 

答えて

7

mのタイプではなく、Mapテンプレートで使用されているタイプです。 Mapテンプレートで使用されているタイプを行メジャーに変更する必要があります。

Eigen::Map<Matrix<double,2,5,RowMajor> >(p,2,5) = m; 
+0

これは機能します。ありがとう。 – Rainfield

関連する問題