c – 将数组映射回现有的特征矩阵

前端之家收集整理的这篇文章主要介绍了c – 将数组映射回现有的特征矩阵前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将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>().

猜你在找的C&C++相关文章