Help us understand the problem. What is going on with this article?

Eigen小ネタ

More than 1 year has passed since last update.

参考ページ

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の要素商

https://stackoverflow.com/questions/36849265/eigen-matrix-broadcasting-operation

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

https://stackoverflow.com/questions/21496157/eigen-how-to-concatenate-matrix-along-a-specific-dimension

gtestでのテストの仕方

https://stackoverflow.com/questions/25094989/compare-eigen-matrices-in-google-test-or-google-mock

トリビア

  • 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.

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

最適化

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした