c++ - 使用特征矩阵作为特征数组引用的参数

标签 c++ eigen

我正在使用一个库,其中的函数获取数组引用并更新它们:

void foo(ArrayXXd A&)

但是,在我的代码中我想使用

Matrix<double,Dynamic,Dynamic>

如何使用矩阵调用函数 foo?我可以以某种方式将矩阵映射到数组吗?

这是编译器错误:

 error: invalid initialization of reference of type ‘Mat& {aka Eigen::Array<double, -1, -1>&}’ from expression of type ‘Eigen::Matrix<double, -1, -1>’

我做了以下似乎有效的操作,但我不知道这是否是通用解决方案(不同的内存布局等)。

//X_IN is a Matrix<double,Dynamic,Dynamic> & 

//Map Matrix to pointer
X_pntr = X_IN.data();
//Map pointer to Array 
ArrayXXd X_array = Map<ArrayXXd>(X_pntr,X_IN.rows(),X_IN.cols());

foo(X_array);

最佳答案

Eigen 中的大多数对象都是表达式(更具体地说,是从 MatrixBase 派生的对象)。如果您想编写一个适用于任何类型的 Matrix/Array 等的函数,而不仅限于例如数组,需要写成如下形式:

template<typename T> 
void foo(Eigen::MatrixBase<T>& A)
{
   // do something here with A
}

现在您可以使用任何类型的对象调用 foo,例如 foo(A*A),其中 A 是一个 MatrixXdMatrixXfArrayXd,您明白了。更多详情请参见官方文档: http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html

读完你的评论后,我可以想出这个解决方案:

Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m(2,2);
m << 1,2,3,4;
Eigen::ArrayXXd tmp = m; // convert into array (via copy)
foo(tmp); // modify tmp
m = tmp; // copy back into m
cout << m; // now m is modified

Eigen支持移动语义时,您将能够使用std::move而不是制作2个拷贝。

关于c++ - 使用特征矩阵作为特征数组引用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002617/

相关文章:

c++ - Sum 1 ~ N,不使用乘法、除法、if、while、for、switch和三元表达式

c++ - 代码不会使用 Eigen 库语法问题进行编译?

c++ - 使用带有 Eigen 的 C 风格数组来实现矩阵逆

c++ - memcpy() 给我段错误

c++ - 指针类型的结构还是指针的结构?

c++ - TCP 和 PF_RING

c++ - Visual Studio 2012 上的计算机错误中缺少 GDAL201.dll

c++ - Eigen:接受固定大小和类型的通用矩阵表达式的函数签名

c++ - 从 QR 对象获取 R 矩阵

c++ - Eigen 矩阵乘法速度