我想的双数组映射到现有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
}
我不知道你想要什么,但我会试着解释。
你混合双人和浮在你的代码(MatrixXf是一个矩阵,其中每一个条目是一个浮动)。 我假设的时刻,这是要处处双无意使用AMD的; 请参阅下面的,如果这是真的你的意图。
指令Map<MatrixXd>(arrayd, n, n) = matrix
拷贝条目matrix
成arrayd
。 它相当于环
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
arrayd[i + j*n] = matrix(i, j);
到的条目复制arrayd
成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复制到双打的数组,那么你需要明确包括演员。 为此在本征的语法是: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()
你不需要做任何的反向操作。
当使用本征::地图要映射原始数组的艾根类。 这意味着,你现在可以阅读或使用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]