大学の研究で運動機構のシミュレーションをしていた時に作った、ベクトルや行列の計算をするクラスを紹介します。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;
}