我想将 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 是一个矩阵,其中每个条目都是 float )。我暂时假设这是无意的,并且您想在任何地方都使用 double ;请参阅下文,了解这是否真的是您的意图。
指令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 复制到 double 组,则需要显式包含转换。 Eigen 中的语法是:Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()
.
关于c++ - 将数组映射回现有的特征矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12003692/