モチベーション
C++の行列計算ライブラリであるEigenの初期化方法の設計に慣れなかったので記録しておく。
公式ドキュメント
以下ををインクルードしていることを前提にする。
# include <Eigen/Core>
# include <iostream>
Fixed Matrix
Matix<スカラーの型,行数、列数> m;
というように指定することで、行列m
を初期化できる。例えば、
Eigen::Matix<double,2、2> m;
このとき、係数はstd::vectorなどと違って空になる。
Dynamic Matrix
コンパイルタイムに要素数が定まらない場合、行・列またはその両方のサイズにDynamic
を指定する必要がある。
Eigen::Matrix<double,3,Eigen::Dynamic> m1;
Eigen::Matrix<double,Eigen::Dynamic,3> m2;
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m3;
初期化しただけでは係数のメモリはアロケートされない。Dynamic Matrixでのみ、サイズを指定しての初期化も可能である。
// 10 * 10 行列
Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic> dynamic1(10,10)
コンパイル時に大きさが定まらない場合や行列サイズが大きい場合にも使える。
int x,y;
// 色々計算する
Eigen::Matrix<int,Eigen::Dynamic,4> dynamic2(x*y,4)
Eigen::Matrix<int,Eigen::Dynamic,4> dynamic3(1000,1000)
エイリアス
Matrixには型エイリアスがある。例えば
typedef Matrix<int, 5, 1> Vector5i;
typedef Matrix<float, 3, 3> Matrix3f;
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
2などの定数か、大きさが動的に定まる場合はXとスカラーの型(dはdouble
,fはfloat
,iはint
)を指定する。dはdimensionの略ではないので注意。
MatrixXd dynamic4(10,10);
VectorXd dynamic5(10);
型エイリアスでも大きさを指定して初期化ができる。
係数の初期化
Fixed Matrixならば初期化のとき、サイズ指定の代わりに係数を含められる。
Eigen::Vector3i v(1, 2, 3);
std::cout<<v<<std::endl;
/*
1
2
3
*/
もしくは、配列のように添え字で代入することができる。
Eigen::Matrix2d m(2,2);
m(0,0)=1;
m(0,1)=2;
m(1,0)=3;
m(1,1)=4;
std::cout<<m<<std::endl;
/*
1 2
3 4
*/
ここで、[]ではなく()なことに注意する。C++の[]は一つしか引数を取れないので()にする必要がある。また、この初期化方法を使う場合は宣言時にサイズが指定されていて、メモリがアロケートされている必要がある。
ストリームのように<<
と,
を使って初期化することもできる。
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout<<m<<std::endl;
/*
1 2 3
4 5 6
7 8 9
*/
まとめ
定義〜初期化は直感的に行えるようになっているが、他では見かけない記法を使うので理解が難しかった。これを乗り越えれば後は簡単に使えそう。終