2012-11-23 73 views
7

我最近開始使用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 

但實際上結果仍然與第一個相同。我的問題是,有沒有辦法將Eigen矩陣映射到C/C++數組,以便數組的數據是基於行的?

我發現我可以使用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

This Works。謝謝。 – Rainfield