【问题标题】:typecasting Eigen::Array to two dimensional std::vector将 Eigen::Array 类型转换为二维 std::vector
【发布时间】:2021-11-16 06:54:12
【问题描述】:

This thread 建议将Eigen::VectorXd 的数据复制到std::vector 的方法

但是,我想知道将二维数组类型转换/复制到 std::vector<std::vector<double>> 中的最干净的方法是什么

【问题讨论】:

  • 这些类型是不相关的,并且两种情况下的内存组织完全不同,所以不可能。对我来说,这听起来像XY problem

标签: c++ eigen stdvector eigen3


【解决方案1】:

您可以在您共享的线程中执行相同的操作,但对每一列(默认 Eigen::ColMajor)或行(Eigen::RowMajor)执行此操作:

Eigen::MatrixXd mat(2,3);
mat << 1.1, 2.1, 3.1,
       4.1, 5.1, 6.1;

std::vector<std::vector<double>> matrix(mat.cols());
auto ptr = mat.data();
for (auto& vec : matrix)
{
    vec = std::vector<int>(ptr, ptr + mat.rows());
    ptr += mat.rows();
}

【讨论】:

    【解决方案2】:

    一种方法可能是使用循环遍历数组的所有值,然后将它们存储在向量中。

    int ar[2][2];
    vector<vector<int>> vec;
    
    int main()
    {
        ar[0][0] = 1;
        ar[0][1] = 2;
        ar[1][0] = 3;
        ar[1][1] = 4;
    
        for(int i = 0; i < 2; i++)
        {
            vector<int>v;
            for(int j = 0; j < 2; j++)
            {
                v.push_back(ar[i][j]);
            }
            vec.push_back(v);
        }
    
        for(int i = 0; i < vec.size(); i++)
        {
            for(int j = 0; j < vec[i].size(); j++) cout<<vec[i][j]<<" ";
            cout<<endl;
        }
    }
    

    另一种方式:遍历每一行并将它们存储在向量中。

    int ar[2][2];
    vector<vector<int>> vec;
    
    int main()
    {
        int row = 2, col = 2;
        ar[0][0] = 1;
        ar[0][1] = 2;
        ar[1][0] = 3;
        ar[1][1] = 4;
    
        for(int i = 0; i < row; i++)
        {
            vector<int> currV = {vector<int> (begin(ar[i]), end(ar[i]))};
            vec.push_back(currV);
        }
    
        for(int i = 0; i < vec.size(); i++)
        {
            for(int j = 0; j < vec[i].size(); j++) cout<<vec[i][j]<<" ";
            cout<<endl;
        }
    }
    

    【讨论】:

    • 问题是关于将 Eigen::Matrix 存储到 std::vector<:vector>>
    猜你喜欢
    • 2014-11-23
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-10-14
    • 2016-10-16
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多