在我看来,我应该能够使用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()))
答案 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());