8

我想将一个双精度数组映射到现有的 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

}
4

2 回答 2

14

我不确定你想要什么,但我会尽力解释。

您在代码中混合了双精度和浮点数(MatrixXf 是一个矩阵,其中每个条目都是浮点数)。我暂时假设这是无意的,并且您想在任何地方使用 double ;如果这真的是您的意图,请参见下文。

该指令Map<MatrixXd>(arrayd, n, n) = matrix复制matrixinto的条目arrayd。相当于循环

for (int i = 0; i < n; ++i)
   for (int j = 0; j < n; ++j)
      arrayd[i + j*n] = matrix(i, j);

要复制arraydinto的条目matrix,您将使用反向赋值:matrix = Map<MatrixXd>(arrayd, n, n)

但是,通常以下技术更有用:

void foo(MatrixXd matrix, int n) {
   double* arrayd = matrix.data();
   // do something with the array 
}

现在 arrayd 指向矩阵中的条目,您可以将其作为任何 C++ 数组进行处理。matrix数据在和之间共享arrayd,因此您不必在最后复制任何内容。顺便说一句,您不需要传递n给函数foo(),因为它存储在矩阵中;使用 matrix.rows() 和 matrix.cols() 来查询它的值。

如果您确实想将 MatrixXf 复制到双精度数组,则需要显式包含强制转换。Eigen 中的语法是:Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>().

于 2012-08-17T14:33:37.317 回答
12

您不需要执行任何反向操作。

使用 Eigen::Map 时,您将原始数组映射到 Eigen 类。这意味着您现在可以使用 Eighen 函数读取或写入它。

如果您修改映射数组,则更改已经存在。您可以简单地访问原始数组。

float buffer[16]; //a raw array of float

//let's map the array using an Eigen matrix
Eigen::Map<Eigen::Matrix4f> eigenMatrix(buffer); 

//do something on the matrix
eigenMatrix = Eigen::Matrix4f::Identity();


//now buffer will contain the following values
//buffer = [1 0 0 0  0 1 0 0  0 0 1 0  0 0 0 1]
于 2013-06-11T08:57:12.803 回答