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

如何将std::vector<double*>中的数组拷贝至Eigen::ArrayXd

解决方案

要把std::vector<double*>中所有C风格数组的内容完整拷贝到Eigen::ArrayXd里,你需要遍历每个数组指针,逐个拷贝对应的内容——之前的方法只处理了第一个数组,所以会丢失后续数据。

方法一:用memcpy循环拷贝(高效,适合已知子数组长度的场景)

假设每个子数组的长度固定(比如示例中的2),代码如下:

std::vector<double*> x;
x.push_back(new double[2]{1, 2});
x.push_back(new double[2]{3, 4});

const int sub_len = 2;
Eigen::ArrayXd x_old(x.size() * sub_len); // 预先分配足够内存

double* dest = x_old.data();
for (double* src : x) {
    // 拷贝当前子数组的内容到x_old的对应位置
    memcpy(dest, src, sub_len * sizeof(double));
    dest += sub_len; // 移动目标指针到下一个子数组的起始位置
}

// 记得用完后释放原数组内存,避免泄漏
for (double* ptr : x) {
    delete[] ptr;
}

方法二:用Eigen::Map结合拼接(更灵活,适合子数组长度不固定的场景)

如果子数组长度不统一,可以先记录每个数组的长度,再循环用Map生成临时ArrayXd并拼接:

// 用pair存储数组指针和对应的长度
std::vector<std::pair<double*, int>> x;
x.emplace_back(new double[2]{1, 2}, 2);
x.emplace_back(new double[3]{3, 4, 5}, 3);

Eigen::ArrayXd x_old;
for (auto& item : x) {
    double* src = item.first;
    int len = item.second;
    Eigen::ArrayXd temp = Eigen::Map<Eigen::ArrayXd>(src, len);
    // 拼接临时数组到x_old
    x_old = x_old.size() == 0 ? temp : x_old.append(temp);
}

// 释放内存
for (auto& item : x) {
    delete[] item.first;
}

为什么之前的方法失败?

  • 你用*x.data()只能拿到x的第一个元素(即第一个数组的指针),所以memcpy只会拷贝第一个数组的内容,后面的内存是未初始化的垃圾值;
  • Eigen::Map本身是内存映射,不会创建拷贝,要生成拷贝需要把Map的结果赋值给新的ArrayXd对象,但同样需要循环处理每个子数组才能拼接成完整的数组。

内容的提问来源于stack exchange,提问作者zenzu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:20:31