行列計算について - arosh/arosh.github.com GitHub Wiki

Eigen

C++が使える環境で、ガチガチにチューニングするほどでも無いなら、Eigenというライブラリを使うのが、最もお手軽。

その他のライブラリ

C++で使える線形代数ライブラリ - Ideals and Reality

BLAS関係のまとめ

BLASという行列演算のコアライブラリの規格がある。

その実装としては、ATLAS(BSDライセンス)、GotoBLAS(商用利用、再配布には許可が必要)、Intel MKL(基本的に有料。Linux版でかつ非商用利用の場合に限り、無償で利用できるらしい)などがある。

実際に利用する際には、CLAPACKなどのラッパーを介することが普通。

Linux で CLAPACK バージョン 3.2.1 のビルドとインストール

以下の文字列は殴り書き

Matrix3dは3次元のdouble型 d: double i: int f: float b: bool c: complex (Matrix2cd, Matrix3cfのように)

4*4まではデフォルトで存在

行列の大きさが固定の時には Matrix<double, 6, 6> のように作れる 行列の大きさが動的の場合は MatrixXd もしくは Matrix<double, Dynamic, Dynamic> を使う Matrix2Xdは列数不定?MatrixX2dは行数不定?

ベクトルの場合はVectorを使う

カンマ演算子で初期化 /* 行列クラスの初期化 */ Matrix3i A; // 3x3 の int 型行列

// (1) カンマ演算による初期化 A << 1,2,3, 4,5,6, 7,8,9;

逆行列は <Eigen/Dence> が必要

Eigenはヘッダファイルをダウンロードするだけで使える プラットフォームに依存しない

コンパイルするときに -l オプションで eigenまでのパスを指定すれば良い

大抵の場合は MatrixXd だけでなんとかなる

MatrixXd その他のベクトルクラスのメンバ関数は <Eigen/Dence> に定義されている

全ての数値が同じ行列 → MatrixXd::Constant(3, 3, 1.2)

comma-initializer

fixed-size 固定サイズ

Matrixクラスはテンプレートパラメータに6つの引数をとるが、初めの3つだけ覚えとけばなんとかなる というか、その3つが必須パラメータ <要素となる値の型, Row, Col>

column-vectorとrow-vector (通常のベクトルは column-vector ) RowVector型がある

small-size-vectorの場合のみ、デフォルトコンストラクタを用いて初期化を行える Vector4d vec(1, 2, 3, 4)

Matrixに対して引数1個で要素を参照しようとしたときは、内部で保持している配列のindexを見に行く(ただし、行と列どちらが優先されるかは不明 → Storage Orders の項目参照)

行列のサイズが1616以下の時には、固定サイズのほうが効率が良い 3232以上のときは、固定サイズにしてもメリットが無視できるほど小さい & スタックオーバーフローすることがあるので 動的割り当てを推奨

部分行列へのアクセス /* ブロック行列を得る */ MatrixXd Apart = A.block(0,0,2,2); // (0,0) 成分からはじまる 2x2 小行列

/* block(...) で帰ってくる部分行列はもとの行列への

  • 参照になっているので代入による変更ができる
  • 論文などではブロック行列形式で書かれていることも
  • 多いので,これを使いこなすとバグが減りそう. */ A.block(0,0,2,2) = Matrix2d::Identity();

行の取り出し、列の取り出しは row() col() でできる

行列のサイズ変更は、縮小であっても、要素は保持されない