C++:将指向数组的指针向量复制到Eigen::ArrayXd

ss2ws0br  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(189)

我有一个std::vector<double *> x,其中每个元素都指向C风格的double数组。double数组的值随着程序的每次迭代而变化。我想在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));
monwx1rj

monwx1rj1#

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]

相关问题