【问题标题】:C++: Copy the vector of pointers to arrays, to Eigen::ArrayXdC++:将指向数组的指针向量复制到 Eigen::ArrayXd
【发布时间】:2022-11-17 21:00:13
【问题描述】:

我有std::vector<double *> x,其中每个元素都指向 C 风格的双精度数组。双数组的值随着我程序的每次迭代而变化。我想将它们的副本创建到 Eigen::ArrayXd x_old 中,这样我就可以用新值计算差异。我试过使用Eigen::Map,但它只复制了一个数组,而且它们仍然在内存方面连接,所以从技术上讲它不是副本。现在我尝试memcpy它,但我只得到第一个数组。谢谢您的帮助

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

Eigen::ArrayXd x_old(4);
memcpy(x_old.data(), *x.data(), 4*sizeof(double));

【问题讨论】:

  • 你为什么使用newdouble*而不是std::array&lt;double,2&gt;std::vector&lt;double&gt;
  • 我正在使用一个要求它具有这样的库。或者至少根据我的理解,我需要以某种方式传递二维数组。 double const* const* parameters
  • 好的,这就是原因;)

标签: c++ eigen


【解决方案1】:

memcpy(x_old.data(), *x.data(), 4*sizeof(double)); 的问题在于,由于您为vector 的每个元素手动分配了内存,下面的数据不再连续,即2 后面没有3。(指针的位置是连续的,但它们指向的数组不是)

所以当你将它们放入x_old时,你无法将它们作为连续内存获取。相反,您需要分别添加 vector 的每个元素:

memcpy(x_old.data(), x[0], 2 * sizeof(double));
memcpy(x_old.data() + 2, x[1], 2 * sizeof(double));

或者写一个 for 循环:

for(std::size_t s = 0; const auto& data: x)
{
    memcpy(x_old.data() + s, data, 2 * sizeof(double));
    s += 2;
}

旁注,*x.data() 等同于x[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多