7

最近、Eigenライブラリを使い始めました。Eigen行列をC/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++配列にマップする方法があるかどうかです。

matrix.data()memember関数を使用して目的の結果を取得できることがわかりましたが、このusemapを使用できるかどうか疑問に思っています。

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;
4

1 に答える 1

7

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

Eigen::Map<Matrix<double,2,5,RowMajor> >(p,2,5) = m;
于 2012-11-23T21:10:17.590 に答える