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

Aka*_*all 1 c++ arrays eigen

在我看来,我应该能够使用std::begin()std::end()转换ArrayXdstd::vector<double>; 但是,当我在下面的代码中尝试它时,我的尝试失败了.我的理解是,.data()任何Eigen对象上的方法都返回一个指向连续内存块的指针,类似于c样式数组.因此,因为我可以使用std::begin(),std::end()在ac风格的数组,我希望也可以使用.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;
}
Run Code Online (Sandbox Code Playgroud)

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

错误:没有匹配函数调用'begin(Eigen :: PlainObjectBase> :: Scalar*)'std :: vector my_vec(std :: begin(e_array.data()),std :: end(e_array.data() ))

Joh*_*nck 5

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

std::vector<double> my_vec(e_array.data(), e_array.data() + 5);
Run Code Online (Sandbox Code Playgroud)

稍微好一些:

std::vector<double> my_vec(e_array.data(), e_array.data() + e_array.size());
Run Code Online (Sandbox Code Playgroud)

你也可以用很多容器做到这一点,但特别是Eigen的ArrayXd,因为它缺乏begin()end()(相关:http://eigen.tuxfamily.org/bz/show_bug.cgi?id = 231 ).

std::vector<double> my_vec(foo.begin(), foo.end());
Run Code Online (Sandbox Code Playgroud)

  • @o11c:我认为这行不通,因为 ArrayXd 没有 begin() 和 end():http://eigen.tuxfamily.org/dox-devel/classEigen_1_1Array.html (2认同)