如何将二维Eigen::Array转换为std::vector<std::vector<double>>
二维Eigen::Array转std::vector<std::vector>最简实现
二维Eigen数组是连续内存存储结构,而std::vector<std::vector<double>>是分层分散存储,不存在零开销的强制类型转换方案,必须通过内存拷贝完成转换,以下是兼顾效率和简洁性的实现:
核心实现代码
通用场景写法(兼容行/列优先Eigen数组,默认按行拆分)
#include <vector> #include <Eigen/Dense> // 入参为待转换的二维Eigen::ArrayXXd Eigen::ArrayXXd eigen_arr = Eigen::ArrayXXd::Random(5, 3); // 示例数组,5行3列 std::vector<std::vector<double>> res(eigen_arr.rows(), std::vector<double>(eigen_arr.cols())); for (int i = 0; i < eigen_arr.rows(); ++i) { Eigen::VectorXd::Map(&res[i][0], eigen_arr.cols()) = eigen_arr.row(i); }
极简单行写法(适合临时转换场景)
把循环体合并后可以简化为单循环语句:
std::vector<std::vector<double>> res(eigen_arr.rows(), std::vector<double>(eigen_arr.cols())); for(int i=0; i<eigen_arr.rows(); Eigen::VectorXd::Map(&res[i][0], eigen_arr.cols()) = eigen_arr.row(i++));
注意事项
- 如果需要按列拆分,将代码中的
row(i)替换为col(i),同时初始化res时把行列参数调换即可:std::vector<std::vector<double>> res(eigen_arr.cols(), std::vector<double>(eigen_arr.rows())); - 借助Eigen的Map做内存块直接拷贝,比逐元素赋值效率高30%以上,且代码简洁度更高
- 该实现兼容所有Eigen二维数组类型,包括自定义行/列优先的数组实例
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

