Boostは汎用的なライブラリであるから、特定の用途に特化したものは自分で用意する必要がある。
すなわちuBlasが提供するのは行列・ベクトルの計算であって幾何計算に特化した関数は用意されていない。
ここではその設計指針について述べる。
基本クラスには次元に依存しないアルゴリズムや演算子のオーバーロードを定義・実装する。
ublasのクラスを派生させる場合には、bounded_matrix, matrix_container, matrix_expressionを引数に取るコピーコンストラクタ・代入演算子を定義する必要がある。
注意点としては二乗は極めて精度が低下する操作である.ノルムのように二乗して平方根をとる操作も精度の低下が大きい.
また,回転成分と並進成分の桁数にはギャップが大きい場合精度が低下しやすい.(逆行列が単位行列にならない=2εを超える誤差が残る)
すなわちuBlasが提供するのは行列・ベクトルの計算であって幾何計算に特化した関数は用意されていない。
ここではその設計指針について述べる。
template<size_t N> class MatrixNxN<N> : public bounded_matrix<double, N, N>; //N次正方行列クラス template<size_t N> class VectorN : public bounded_vector<double, N>; //N次ベクトルクラス
基本クラスには次元に依存しないアルゴリズムや演算子のオーバーロードを定義・実装する。
ublasのクラスを派生させる場合には、bounded_matrix, matrix_container, matrix_expressionを引数に取るコピーコンストラクタ・代入演算子を定義する必要がある。
本来テンプレートでは派生よりも特殊化で対応すべきであるが、幾何計算になると特殊化のみで対応が厳しくなってくる。
そのため、今回は派生クラスとして幾何計算用の行列・ベクトルクラスを定義することにした。
matrix_container, matrix_expressionに対するコピーコンストラクタ・代入演算子を記述することで、
ublas関数による計算結果(計算式)で初期化や代入することが可能となる。
そのため、今回は派生クラスとして幾何計算用の行列・ベクトルクラスを定義することにした。
class Matrix2x2 : public MatrixNxN<2>; //二次元回転行列 class Matrix3x3 : public MatrixNxN<3>; //二次元同次変換行列、三次元回転行列 class Matrix4x4 : public MatrixNxN<4>; //三次元同次変換行列 class Vector2D : public VectorN<2>; //二次元ベクトル class Vector3D : public VectorN<3>; //二次元同次座標、三次元座標 class Vector4D : public VectorN<4>; //三次元同次座標ここでも同様に
matrix_container, matrix_expressionに対するコピーコンストラクタ・代入演算子を記述することで、
ublas関数による計算結果(計算式)で初期化や代入することが可能となる。
- 乗算ではマシンイプシロンに起因する極めて小さな値は0でクリアする.
- 逆行列はLU分解などで直接求めず,回転行列および同次変換行列に特化したアルゴリズムを用いる.
- その他必要な関数を実装していく.
- 回転ベクトル→回転行列およびその逆
- 回転軸と角度→回転行列およびその逆
- 回転行列の軸の補正(直交化)
- 指定された順序のオイラー角への分解およびその逆 など
注意点としては二乗は極めて精度が低下する操作である.ノルムのように二乗して平方根をとる操作も精度の低下が大きい.
また,回転成分と並進成分の桁数にはギャップが大きい場合精度が低下しやすい.(逆行列が単位行列にならない=2εを超える誤差が残る)
コメントをかく