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

Use eigen matrix as argument for eigen array reference

本文关键字:数组 引用 参数 为特征 特征      更新时间:2023-10-16

我正在使用一个函数接受数组引用并更新它们的库:

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等,而不仅仅局限于Array,你需要写在以下形式:

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

现在您可以用任何类型的对象调用foo,例如foo(A*A),其中AMatrixXd,或MatrixXfArrayXd,您明白了。请参阅官方文档了解更多详细信息: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个副本。