C++ 为什么memcpy无法复制特征矩阵数据,而std::copy成功了?

C++ 为什么memcpy无法复制特征矩阵数据,而std::copy成功了?,c++,memory,copy,eigen,memcpy,C++,Memory,Copy,Eigen,Memcpy,当我使用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; 我可以用指针遍历数据,打印每个元素: double * d = M.data(); for(int i = 0;i<M.size();i++) { std::cout<<*

当我使用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;
我可以用指针遍历数据,打印每个元素:

  double * d = M.data();
  for(int i = 0;i<M.size();i++)
  {
    std::cout<<*d<<" ";
    d++;
  }
  std::cout<<std::endl;
我还可以使用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;
然而,我似乎无法使用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;

memcpy没有做我期望它应该做的事情,有什么好的理由吗?(还是我使用不当?

您需要乘以双精度的大小:

memcpy(data_memcopy,M.data(),M.size() * sizeof(double));
否则,您只复制M.size()字节,并且在您的计算机上,每个双字节都多于一个字节

因此,您可能只对第一个和第二个double进行了写入(系统上可能有8个字节,因为您成功地复制了第一个,而第二个double可能只复制了一个可能为零的字节)

1 2 3 4 5 6 7 8 9
  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(data_memcopy,M.data(),M.size() * sizeof(double));