使用特征矩阵作为特征数组引用的参数
Use eigen matrix as argument for eigen array reference
我正在使用一个函数接受数组引用并更新它们的库:
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)
,其中A
是MatrixXd
,或MatrixXf
或ArrayXd
,您明白了。请参阅官方文档了解更多详细信息: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个副本。
相关文章:
- 通过指针与数组引用扩展数组索引序列
- 将链表的内容放在数组引用中
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C 在将数组引用分配给struct时麻烦
- Typedef数组引用
- 通过强制转换创建子数组引用
- 将数组引用 'T(&)[n]' 引用到 'std::array<T, n>' 的内容
- constexpr 数组引用参数
- 寻找有关函数定义和原型中数组引用的说明
- Initializer_list作为非模板上下文中数组引用参数的参数
- 如何使用一个动态创建的一维数组的二维数组引用仅与标准库?
- 如何返回具有大小的POD数组引用
- 在C++中返回数组引用的语法
- 是否可以声明转换函数返回数组引用而不使用typedef
- 自定义到数组引用的转换
- 类数组引用的NullReferenceException
- 数组指针与数组引用之间的差异
- 在c++中传递数组引用
- 使用特征矩阵作为特征数组引用的参数
- 如何从函数传递数组引用