You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将二维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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:54:03