将 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&lt;ArrayXd&gt;ArrayXd&amp; 的已知对话。 这样做的正确方法是什么?

编辑: luk32 在下面指出的答案是可行的,但是它涉及将我的代码移动到头文件中,这是我希望尽可能避免的事情。

【问题讨论】:

Eigenc 标签?真的......到底是什么。 @luk32 抱歉,删除了 c 标签 【参考方案1】:

这正是 Ref&lt;&gt; 类的目的:

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 实现。但是我不确定是否有从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);

【讨论】:

是的,这行得通。但是,我需要将我的代码移动到头文件中,如果可能的话,这是我想避免的。如果没有其他办法,我会接受这个答案。 @ArneBöckmann 好吧,我不确定您是否阅读了教程,但从 3.2.1 开始,有 Ref 设施。 在 3.2.1 中引入?这就解释了为什么我在我们当前的 eigen 安装中找不到它。我想现在升级 eigen 不是一个选项:/ 我会接受这个答案并尝试说服某人升级 eigen 版本:D 我必须更新我的 eigen 安装才能检查代码。以前我有 3.1.x。我也使用了官方版本,而不是存储库的东西。

以上是关于将 Eigen::Map<ArrayXd> 传递给期望 ArrayXd& 的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Eigen 中使用原始 c 样式矩阵

OPENCV 2.4.9 cv2eigen 语义错误

将行优先数组映射到列优先特征矩阵

从具有行主顺序的数组创建特征矩阵

如何设置 SVG <g> 元素的样式?

g:formatDate 作为 g:textField 上的值