7

コードで Eigen の MatrixXd 行列を使用していますが、ある時点で 3D 行列が必要になります。Eigen は線形代数のみに最適化されているため、3 次元の行列型を持たないため、代わりに MatrixXd 型のポインター配列を作成しています。

Eigen::MatrixXd *CVM =new Eigen::MatrixXd[100];
for (int i = 0; i < 100; i++){
   CVM[i]= Eigen::MatrixXd::Zero(5,5);
}

ただし、後でこの配列の値にアクセスする必要があり、そのために次のようなことをしています。

for (int k = 0; k < 100; k++){
   Eigen::MatrixXd* b=&CVM[k];

   for (int i = 0; i < 5; i++){
      for (int j = 0; j < 5; j++){
         b->coeff(i,j)=47;
      }      
   }
}

それ自体でbはなくポインターであるため、明らかに機能しないため、代わりにメソッドを使用していますが、次のエラーが発生します。MatrixXdb(i,j)coeff()

error: assignment of read-only location ‘b->Eigen::Matrix<double, -1, -1>::<anonymous>.Eigen::PlainObjectBase<Derived>::coeff<Eigen::Matrix<double, -1, -1> >(((Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1> >::Index)i), ((Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1> >::Index)j))’

編集:出力が追加されました

cout << b << endl;
cout << CVM[47] << endl;


0x1c34b00
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
4

2 に答える 2

2

operator()(int,int) を使用するだけです

CVM[k].operator()(i,j) = 47;

また

CVM[k](i,j) = 47;

また

Eigen::MatrixXd* b = &CVM[k];
b->operator()(i,j) = 47;

ここで、k は行列、i は行、j は列です。

于 2016-11-04T18:21:50.690 に答える