gpt4 book ai didi

c++ - 为什么memcpy复制Eigen矩阵数据失败,std::copy成功?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:42 53 4
gpt4 key购买 nike

当我使用 Eigen 创建矩阵时,如下所示:

  Eigen::MatrixXd M(3,3);
M<< 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 ;
std::cout<<M<<std::endl;

产生

1 4 7
2 5 8
3 6 9

我可以用指针遍历数据,打印每个元素:

  double * d = M.data();
for(int i = 0;i<M.size();i++)
{
std::cout<<*d<<" ";
d++;
}
std::cout<<std::endl;

产生

1 2 3 4 5 6 7 8 9

我还可以使用 std::copy 将其复制到堆栈上相同类型的数组,然后打印该数组的元素:

  double data_copy[9];
std::copy(M.data(),M.data()+M.size(),data_copy);
for(int i = 0;i<M.size();i++)
{
std::cout<<data_copy[i]<<" ";
}
std::cout<<std::endl;

产生

1 2 3 4 5 6 7 8 9

但是,我似乎无法使用 memcpy 进行等效复制。这只能复制第一个元素:

  double data_memcopy[9];
memcpy(data_memcopy,M.data(),M.size());
for(int i = 0;i<M.size();i++)
{
std::cout<<data_memcopy[i]<<" ";
}
std::cout<<std::endl;

产生

1 0 0 0 0 0 0 0 0

为什么 memcpy 没有按照我的预期去做,有什么好的理由吗? (还是我使用不当?)

最佳答案

您需要乘以 double 的大小:

memcpy(data_memcopy,M.data(),M.size() * sizeof(double));

否则,您只是在复制 M.size() 字节,并且每个 double 在您的机器上都超过一个字节。

所以你可能只写了第一个和第二个 double (它们在你的系统上可能是 8 个字节,因为你成功地复制了第一个,而第二个 double 你可能只复制了一个可能为零的字节)。

关于c++ - 为什么memcpy复制Eigen矩阵数据失败,std::copy成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258432/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com