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

时间:2014-06-02 20:22:12

标签: 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);

1 个答案:

答案 0 :(得分:2)

Eigen中的大多数对象都是表达式(更具体地说,是从MatrixBase派生的对象)。如果您想编写适用于任何类型的Matrix / Array等的功能,并且不仅限于Array,您需要以下列形式编写它:

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

现在,您可以使用任何类型的对象调用foo,例如foo(A*A),其中AMatrixXd,或MatrixXf或{{1你明白了。有关详细信息,请参阅官方文档: http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html

阅读完评论后,我可以提出这个解决方案:

ArrayXd

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而不是制作2份副本。