行列

行列は平行移動や回転などの変換や,剛体の慣性モーメントを表現するために使われます. 例えば,double型の要素からなる$3 \times 3$行列$A$は次のように定義します.

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

となります. ちなみにさきほどのMatrix3dTMatrixCol<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