大学の研究で運動機構のシミュレーションをしていた時に作った、ベクトルや行列の計算をするクラスを紹介します。GitHubにあるのでダウンロードしてみて下さい。
https://github.com/shoarai/arith
使い方
ベクトルの計算
ベクトルを含んだ計算を演算子のオーバーロードを使って実現することで、数式のようにスッキリと書けます。例では3次元ベクトルを計算していますが、z成分の値を0にすれば2次元ベクトルの計算も問題なくできます。
#include "arith/src/arith.h" using namespace arith; int main() { // 初期化 Vector vecA; // x=0, y=0, z=0 Vector vecB(1, 10, 100); // x=1, y=10, z=100 // 要素の設定 vecA.set(1, 2, 3); // 要素の取得 double x = vecA.getx(); double y = vecA.gety(); double z = vecA.getz(); Vector vecC; // ベクトル同士の加減算 vecC = vecA + vecB; vecC += vecA; vecC = vecA - vecB; vecC -= vecA; int val = 10; // ベクトルとスカラの乗除算 vecC = vecA * val; vecC *= val; vecC = vecA / val; vecC /= val; // 外積 vecC = vecA * vecB; // 内積 double inner = vecA % vecB; // ノルム double norm = vecA.norm(); // 正規化 vecC = vecA.normalize(); return 0; }
行列の計算
次は行列の計算!
#include "arith/src/arith.h" using namespace arith; int main { // 初期化 Matrix matA(3, 2); // 3行2列行列 Matrix matB(3, 2); // 3行2列行列 // 要素の設定 matA(0, 1) = 10; matB(2, 1) = 20; // 要素の取得 double a01 = matA(0, 1); double b21 = matB(2, 1); // 行列同士の加減算 Matrix matC = matA + matB; matC += matA; matC = matA - matB; matC -= matB; Matrix matD(2, 3); // 行列同士の乗算 Matrix matE = matD * matA; int val = 10; // 行列とスカラの乗除算 matA = matB * val; matA *= val; matA = matB / val; matA /= val; // 転置行列 matA = matD.transpose(); return 0; }
正方行列の計算
次は行列の中でも、行と列の数が同じ正方行列の計算です。正方行列にのみ定義されている値を計算できます。
#include "arith/src/arith.h" using namespace arith; int main { // 初期化 SquareMatrix smatA(3); // 3行3列の正方行列 Matrix matA(2, 2); // 正方行列への型変換 SquareMatrix smatB = matA; // 行列式 double det = smatA.det(); // 逆行列 if (det != 0) { SquareMatrix smatC = smatA.invrs(det); } return 0; }