LoginSignup
5
6

More than 5 years have passed since last update.

Eigen小ネタ

Last updated at Posted at 2018-12-19

参考ページ

std::vectorからEigen::VectorXdやEigen::MatrixXdへの型変換

std::vector<std::vector<int> > X_std = hogehoge;                                                                                             
std::vector<int> Y_std = fugafuga;                                                                                                            
int X_size = X_vec[0].size();                                                                                                                             
MatD X_mat = MatD::Zero(n_topics_, X_size);                                                                                                                       
for ( int i = 0; i < n_docs_; ++i) {                                                                                                                      
   X_.row(i) += Eigen::Map<VecI>(X_vec[i].data(), X_size).transpose().cast<double> ();                                                                     
  }                                                                                                                                                         
VecD Y_vec = Eigen::Map<VecI>(Y_vec.data(), n_docs_).cast<double> ();

ブロードキャスト

公式ドキュメントに記載されている通り、標準のブロードキャストは、+, -,+=, -=しかない。
掛け算や割り算で、matrixとvectorを要素積したい時には別の書き方をする必要がある。

matrix-vectorの要素積

Eigen::VectorXd vector = hogehoge;
Eigen::MatrixXd mat =fugafuga;
mat = mat * vec.asDiagonal();

matrix-vectorの要素商

Eigen::VectorXd vector = hogehoge;
Eigen::MatrixXd mat =fugafuga;
mat = mat.rowwise().array() / vec.transpose().array();

ベクトルを規定としてrank1の行列を作るとき(外積?)

Eigen::VectorXd vector = hogehoge;
vector * vector.transpose();

reshape

  • vector
Eigen::Map<VecD> vec_reshape(vec.data(), vec.size() - 1);
  • matrix
mat.conservativeResize(n,m);

注意:元のmatが書き換わってしまいます。

concat

gtestでのテストの仕方

トリビア

  • Matrix.row(d)はVector型ではない。VectorXd v = Matrix.row(d) は暗黙にキャストしている。
    • transposeするだけ?
  • 行方向を取り出す演算(mat.row(d)mat.rowwise())は、行方向ベクトルになるので、演算するときに注意する(transposeを自分または相手に行う。)
  • 関数で行列の行や列だけを参照渡しできない。(以下が例)
    • 参照の場合、constである必要があるから。
void func(Eigen::VectorXd &v){
  // proc something
};

Eigen::MatrixXd m = Eigen::MatrixXd::Constant(n,m,1.2);
int l = 1;

func(m.row(l).transpose()) //error because &v needs to be const to get m.row(l).transpose()
func(m.col(l)) // I didn't try but it seems the same with the above

エラーについて

  • THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES

arrayのみに実装されており、matrixに実装されていないメソッドや演算子を使うと発生。
割り算などは、arrayのみに実装されているので、要注意。

  • Asertion `rows() == rhs.rows() && cols() == rhs.cols()' failed.

確保している行列の大きさよりも大きなインデックスへアクセスしようとしてしまっている。

最適化

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6