行列は平行移動や回転などの変換や,剛体の慣性モーメントを表現するために使われます. 例えば,double型の要素からなる行列は次のように定義します.
Matrix3d A;
要素アクセスは[]演算子を用います.
x[0][1]; // element at 0-th row, 1-th column
任意の固定サイズの行列も使えます. メモリ上に列方向に要素が整列した行列は
TMatrixCol<2, 3, float> M; // column-oriented 2x3 matrix
要素が行方向に整列した行列は
TMatrixRow<2, 3, float> M; // row-oriented 2x3 matrix
となります. ちなみにさきほどのMatrix3dはTMatrixCol<3,3,double>と等価です.
可変サイズ行列は
VMatrixCol<float> M; M.resize(10, 13); // column-oriented variable matrix
で使えます. VMatrixColでは要素はメモリ上で列方向に並びます. 一方VMatrixRowでは行方向に要素が並びます.
行列型についても,ベクトル型と同様の四則演算がサポートされています. 行列とベクトル間の演算は次のようになります.
Matrix3d M; Vec3d a, b; b = M * a; // multiplication
すべての行列型について以下のメンバ関数で行数および列数が取得できます.
M.height(); // number of rows M.width(); // number of columns
2x2, 3x3行列については以下の静的メンバ関数が用意されています.
Matrix2d N; Matrix3d M; double theta; Vec3d axis; // methods common to Matrix2[f|d] and Matrix3[f|d] M = Matrix3d::Zero(); // zero matrix; same as M.clear() M = Matrix3d::Unit(); // identity matrix M = Matrix3d::Diag(x,y,z); // diagonal matrix N = Matrix2d::Rot(theta); // rotation in 2D M = Matrix3d::Rot(theta, 'x'); // rotation w.r.t. x-axis // one can specify 'y' and 'z' too M = Matrix3d::Rot(theta, axis); // rotation along arbitrary vector