Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@meshidenn

Eigen小ネタ

参考ページ

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.

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

最適化

6
Help us understand the problem. What is going on with this article?
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
6
Help us understand the problem. What is going on with this article?