我的一些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下面指出的答案是可行的,但它涉及将我的代码移动到头文件,这是我想尽可能避免的。
答案 0 :(得分:1)
您应该使executeStep
成为模板功能。或者使用他们的其他工具,例如Ref Writing 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);
}
答案 1 :(得分:1)
这正是Ref<>
类的目的:
bool Dmp::executeStep(Ref<ArrayXd> position, Ref<ArrayXd> velocity, Ref<ArrayXd> acceleration)
{
}