将Eigen::VectorXd强制转换为std::vector

45

有许多链接可以反过来转换,但我无法找到在我的特定情况下从Eigen::Matrix或Eigen::VectorXd获取std::vector的方法。


由于我在寻找“许多链接来回转”的过程中遇到了困难,建议查看https://dev59.com/imQn5IYBdhLWcg3wLkkd#44613025以获取另一种方法。我希望这能为一些人节省时间。 - C. Binair
3个回答

61
vector<int> vec(mat.data(), mat.data() + mat.rows() * mat.cols());

8
mat.rows() * mat.cols() 可以简化为 mat.size(),但要注意这种解决方案仅适用于普通的 Matrix<> 对象,如果使用我的答案中所示的 Map<>,则可适用于子矩阵。 - ggael
3
如果有人需要将矩阵的一行复制到向量中:vector<double> vec(arr.cols()); Map<RowVectorXd>(&vec[0], 1, mat.cols()) = mat.row(0); - zardosht

59

你不能使用类型转换,但你可以轻松地复制数据:

VectorXd v1;
v1 = ...;
vector<double> v2;
v2.resize(v1.size());
VectorXd::Map(&v2[0], v1.size()) = v1;

1
嘿,谢谢你的回复。但是我觉得上面那个答案更简洁明了。 - Manish

2
你可以从Eigen向量中进行这个操作:
    //init a first vector
    std::vector<float> v1;
    v1.push_back(0.5);
    v1.push_back(1.5);
    v1.push_back(2.5);
    v1.push_back(3.5);

    //from v1 to an eignen vector
    float* ptr_data = &v1[0];
    Eigen::VectorXf v2 = Eigen::Map<Eigen::VectorXf, Eigen::Unaligned>(v1.data(), v1.size());

    //from the eigen vector to the std vector
    std::vector<float> v3(&v2[0], v2.data()+v2.cols()*v2.rows());


    //to check
    for(int i = 0; i < v1.size() ; i++){
        std::cout << std::to_string(v1[i]) << " | " << std::to_string(v2[i]) << " | " << std::to_string(v3[i]) << std::endl;
    }

1
v1.data() 应该被替换为 ptr_data,对吗? - quant_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接