我想将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>().