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

Use std::begin(), std::end() to convert ArrayXd to stl vector,

本文关键字:std stl 向量 转换 end begin 使用 ArrayXd      更新时间:2023-10-16

在我看来,我应该能够使用std::begin()std::end()ArrayXd转换为std::vector<double>;然而,当我在下面的代码中尝试它时,我的尝试失败了。我的理解是,任何Eigen对象上的.data()方法都会返回一个指向类似于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;
}

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

错误:没有可用于调用的匹配函数'开始(特征::PlainObjectBase>::标量*)'std::vector my_vec(std::begin(e_array.data()),std::end(e_array.data())

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());