5

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 が期待どおりに動作しない正当な理由はありますか? (それとも私の使い方が悪いのでしょうか?)

4

1 に答える 1

8

ダブルのサイズを掛ける必要があります:

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

それ以外の場合は、M.size()バイトのみをコピーし、各doubleはマシン上で複数のバイトになります。

したがって、おそらく1番目と2番目のdoubleにのみ書き込みを行っていました(最初のdoubleは正常にコピーされたため、システム上ではおそらく8バイトであり、2番目のdoubleはおそらくゼロである可能性が高い1バイトのみをコピーしました)。

于 2012-02-13T09:52:26.177 に答える