我有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));
发布于 2022-11-17 12:39:04
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]
是一样的。
https://stackoverflow.com/questions/74474821
复制相似问题