映射数组回现有本征矩阵(Mapping array back to an existing Eige

2019-06-27 03:02发布

我想的双数组映射到现有MatrixXd结构。 到目前为止,我已经成功地将特征矩阵映射到一个简单的数组,但我找不到这样做回来的路上。

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

}

Answer 1:

我不知道你想要什么,但我会试着解释。

你混合双人和浮在你的代码(MatrixXf是一个矩阵,其中每一个条目是一个浮动)。 我假设的时刻,这是要处处双无意使用AMD的; 请参阅下面的,如果这是真的你的意图。

指令Map<MatrixXd>(arrayd, n, n) = matrix拷贝条目matrixarrayd 。 它相当于环

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

到的条目复制arraydmatrix ,将使用逆赋值: matrix = Map<MatrixXd>(arrayd, n, n)

然而,通常可以采用以下技术更加有用:

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

现在arrayd点矩阵中的条目,并可以处理它作为任何C ++阵列。 这些数据之间的共享matrixarrayd ,所以你不必复制任何东西在最后。 顺便说一句,你不需要通过n的函数foo()因为它是存储在矩阵; 使用matrix.rows()和matrix.cols()来查询它的价值。

如果你想一个MatrixXf复制到双打的数组,那么你需要明确包括演员。 为此在本征的语法是: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()



Answer 2:

你不需要做任何的反向操作。

当使用本征::地图要映射原始数组的艾根类。 这意味着,你现在可以阅读或使用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]


文章来源: Mapping array back to an existing Eigen matrix