将 Eigen::Map<ArrayXd> 传递给期望 ArrayXd& 的函数
Posted
技术标签:
【中文标题】将 Eigen::Map<ArrayXd> 传递给期望 ArrayXd& 的函数【英文标题】:Passing Eigen::Map<ArrayXd> to a function expecting ArrayXd& 【发布时间】:2014-03-05 09:26:43 【问题描述】:我的一些 Eigen C++ 方法需要可以从普通 C++ 调用,因此我想提供接受 c 数组并使用 Eigen::Map 将它们映射到 ArrayXd 的重载函数。
我目前的代码如下所示:
bool Dmp::executeStep(double* position, double* velocity,
double* acceleration, const int len)
Map<ArrayXd> posMap(position, len);
Map<ArrayXd> velMap(velocity, len);
Map<ArrayXd> accMap(acceleration, len);
return executeStep(posMap, velMap, accMap);
bool Dmp::executeStep(ArrayXd& position, ArrayXd& velocity, ArrayXd& acceleration)
//Code that modifies position, velocity and acceleration
这不起作用,因为没有从 Map<ArrayXd>
到 ArrayXd&
的已知对话。
这样做的正确方法是什么?
编辑: luk32 在下面指出的答案是可行的,但是它涉及将我的代码移动到头文件中,这是我希望尽可能避免的事情。
【问题讨论】:
Eigen
和 c
标签?真的......到底是什么。
@luk32 抱歉,删除了 c 标签
【参考方案1】:
这正是 Ref<>
类的目的:
bool Dmp::executeStep(Ref<ArrayXd> position, Ref<ArrayXd> velocity, Ref<ArrayXd> acceleration)
【讨论】:
【参考方案2】:您应该将executeStep
设为模板函数。或者使用他们的其他设施,例如RefWriting Functions Taking Eigen Types as Parameters 上的文档中有一个完整的综合教程。
我不确定 Map
是否有比 EigenBase
更直接的父级(也许 Dense 真的不确定),但因为它是最通用的,它应该可以工作:
template <typename Derived>
void Dmp::executeStep(EigenBase<Derived>& pos,EigenBase<Derived>& vel, EigenBase<Derived>& acc )
// fun ...
当然你也需要将它声明为模板成员。
我真的强烈建议阅读整个教程。
使用Ref
实现。但是我不确定是否有从Map
到MyMatrix
的副本。 Ref
不接受 Map
对象,因为它似乎将它们转换为 DenseMatrix
。
#include <Eigen/Core>
#include <iostream>
using namespace Eigen;
typedef Matrix<int,2,4> MyMatrix ;
void print_size(const Ref<const MyMatrix>& b)
std::cout << "size (rows, cols): " << b.size() << " (" << b.rows()
<< ", " << b.cols() << ")" << "\n";
int main()
int array[8];
for(int i = 0; i < 8; ++i) array[i] = i;
Map<MyMatrix> map(array);
std::cout << "Column-major:\n" << map << "\n";
print_size(map);
【讨论】:
是的,这行得通。但是,我需要将我的代码移动到头文件中,如果可能的话,这是我想避免的。如果没有其他办法,我会接受这个答案。 @ArneBöckmann 好吧,我不确定您是否阅读了教程,但从 3.2.1 开始,有Ref
设施。
在 3.2.1 中引入?这就解释了为什么我在我们当前的 eigen 安装中找不到它。我想现在升级 eigen 不是一个选项:/ 我会接受这个答案并尝试说服某人升级 eigen 版本:D
我必须更新我的 eigen 安装才能检查代码。以前我有 3.1.x。我也使用了官方版本,而不是存储库的东西。以上是关于将 Eigen::Map<ArrayXd> 传递给期望 ArrayXd& 的函数的主要内容,如果未能解决你的问题,请参考以下文章