2012-11-23 49 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