Почему memcpy не может скопировать данные собственной матрицы, но std :: copy успешно? - PullRequest
5 голосов
/ 13 февраля 2012

Когда я создаю матрицу, используя 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 не делает то, что я ожидал, должен?(Или я неправильно его использую?)

1 Ответ

8 голосов
/ 13 февраля 2012

Вам необходимо умножить на размер двойного:

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

В противном случае вы копируете только байты M.size (), и каждый дубль занимает больше одного байта на вашем компьютере.

Таким образом, вы, вероятно, записывали только первый и второй дубликаты (в вашей системе они, вероятно, занимают 8 байт, поскольку вы успешно скопировали первый, а во втором дубликате вы, вероятно, скопировали только один байт, который, вероятно, был равен нулю).

...