在我看来,我应该能够使用std::begin()并std::end()转换ArrayXd为std::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() ))
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)