使用std :: begin(),std :: end()将ArrayXd转换为stl向量,

时间:2014-10-10 04:16:37

标签: c++ arrays eigen

在我看来,我应该能够使用std::begin()std::end()ArrayXd转换为std::vector<double>;但是,当我在下面的代码中尝试它时,我的尝试失败了。我的理解是任何.data()对象上的Eigen方法返回一个指向连续内存块的指针,类似于c样式数组。因此,由于我可以在c样式数组上使用std::begin()std::end(),因此我希望也可以使用.data()。然而,Eigen类是模板化的,我认为这是导致我出现问题的原因,但是没有办法解决这个问题。该怎么做?

#include <iostream>
#include <vector>
#include <Eigen/Dense>

using namespace Eigen;

int main()
{
  ArrayXd e_array(5);
  e_array << 3,4,5,6,7;  

  double c_array[] = {1,2,3,4,5};

  //Fails 
  // std::vector<double> my_vec(std::begin(e_array.data()), std::end(e_array.data()));

  // Works
  // std::vector<double> my_vec(e_array.data(), e_array.data() + 5);


  // Works
  // std::vector<double> my_vec(std::begin(c_array), std::end(c_array));
  // Works
  // std::vector<double> my_vec(c_array, c_array + 5);

  return 0;
}

我的错误消息(第一行,整个消息很长):

  

错误:没有匹配的调用函数   'begin(Eigen :: PlainObjectBase&gt; :: Scalar *)'   std :: vector my_vec(std :: begin(e_array.data()),   的std ::端(e_array.data()))

1 个答案:

答案 0 :(得分:5)

std::begin(vec.data())无法工作,因为data()返回一个原始指针,该指针无法传达向量中的元素数。这个版本是你最好的版本之一:

std::vector<double> my_vec(e_array.data(), e_array.data() + 5);

稍好一点:

std::vector<double> my_vec(e_array.data(), e_array.data() + e_array.size());

您也可以使用许多容器执行此操作,但不能使用Eigen的ArrayXd,因为它缺少begin()end()(相关:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=231 )。

std::vector<double> my_vec(foo.begin(), foo.end());