将一个Eigen矩阵映射到C数组

7

我最近开始使用Eigen库。我有一个关于将Eigen矩阵映射到C/C++数组的问题。默认情况下,Eigen矩阵是列优先的。因此,如果我使用以下代码将矩阵映射到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()成员函数来获取所需的结果,但我想知道是否可以使用map来完成此操作:

使用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;
1个回答

7

重要的不是矩阵 m 的类型,而是在 Map 模板中使用的类型。您需要将 Map 模板中使用的类型更改为行优先。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接