将Eigen :: Map <arrayxd>传递给期望ArrayXd&amp; </arrayxd>的函数

时间:2014-03-05 09:26:44

标签: c++ eigen

我的一些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下面指出的答案是可行的,但它涉及将我的代码移动到头文件,这是我想尽可能避免的。

2 个答案:

答案 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实施。但我不确定是否有MapMyMatrix的副本。 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)
{
}