我想将double数组映射到现有的MatrixXd结构.到目前为止,我已经设法将Eigen矩阵映射到一个简单的数组,但我找不到回来的方法.
- void foo(MatrixXd matrix,int n){
- double arrayd = new double[n*n];
- // map the input matrix to an array
- Map<MatrixXd>(arrayd,n,n) = matrix;
- //do something with the array
- .......
- // map array back to the existing matrix
- }
解决方法
我不确定你想要什么,但我会试着解释一下.
你在代码中混合了double和float(MatrixXf是一个矩阵,每个条目都是一个浮点数).我现在假设这是无意的,你想在任何地方使用双倍;如果这真的是你的意图,请参见下文.
指令Map< MatrixXd>(arrayd,n)=矩阵将矩阵的条目复制到arrayd中.它相当于循环
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < n; ++j)
- arrayd[i + j*n] = matrix(i,j);
要将arrayd的条目复制到矩阵中,可以使用反向赋值:matrix = Map< MatrixXd>(arrayd,n).
但是,通常以下技术更有用:
- void foo(MatrixXd matrix,int n) {
- double* arrayd = matrix.data();
- // do something with the array
- }
现在arrayd指向矩阵中的条目,您可以将其作为任何C数组进行处理.矩阵和arrayd之间共享数据,因此您不必在最后复制任何内容.顺便说一下,你不需要将n传递给函数foo(),因为它存储在矩阵中;使用matrix.rows()和matrix.cols()来查询其值.
如果您确实要将MatrixXf复制到双精度数组,则需要显式包含强制转换. Eigen中的语法是:Map< MatrixXd>(arrayd,n)= matrix.cast< double>().