Springhead
An open source physics engine for virtual reality, haptics and motion generation.
ポータブル テンプレート 行列クラスライブラリ

ファイル

ファイル  TMatrix.h
 テンプレートによるN×M行列型の定義.
 

説明

作者
長谷川 晶一
日付
2001年6月10日,2003年10月20日,2008年2月更新

1 はじめに

このドキュメントはポータブルテンプレート行列クラスライブラリのドキュメントです.ポータブル テンプレート 行列クラスライブラリは,テンプレートによるM×N行列のクラスライブラリです.

2 このライブラリの特徴

2.1 複数のメモリモデルのサポート.

2.2 特徴

テンプレート版(TVector, TMatrix)は,テンプレートでコンパイル時に行列のサイズを決定しており, 行列のサイズやポインタなどを保持するための管理領域を持ちません.そのため,

ことができます. また,様々な並び方のベクトル・行列をサポートしているので,

といった特徴があります.

また,デバッガで見たときにデータが見やすいよう, 一番派生側のクラスがメンバ変数としてデータを持つようになっています. 2次元,3次元,4次元のベクトルでは,x, y, z, w や r, g, b などの メンバ変数名でデータにアクセスすることができます.

2.3 移植性

一応,

をサポートしたいと考えています.以前はしていたのですが,Visual C++ 6.0のサポートはやめました.

2.4 新たにクラスライブラリを作成した理由

すでに多くの行列ライブラリがありながら,新たに作成した理由は,

からです.

3 使い方

ポータブル テンプレート 行列クラスライブラリは,ヘッダファイルだけからなる クラスライブラリなので, TMatrix.h, TMatrixUtility.h, TVector.h を同じフォルダに入れておき,.cppファイルからヘッダをインクルードするだけで 使用できます.

3.1 サンプル

簡単なサンプルです.適当なファイル名(たとえば sample.cpp) で保存してコンパイルしてください. gcc の場合 g++ を使ってください.

#include "TMatrix.h"    //  行列ライブラリのインクルードする.
#include <iostream>
using namespace PTM;    //  行列クラスはPTM名前空間の中で宣言されている.
int main(){
    TMatrixRow<2,2,float> mat;              // 2行2列の行が詰った行列を宣言
                                            // TMatrixColだと列が詰った行列になる
    mat[0][0] = 1;  mat[0][1] = 2;          // 0行0列 = 1;  0行1列 = 2;
    mat[1][0] = 3;  mat[1][1] = 4;          // 1行0列 = 3;  1行1列 = 4;
    TVector<2,float> vec;                   // 2次元のベクトルを宣言
    vec[0] = 1; vec[1] = 0;
    std::cout << mat;
    std::cout << vec << std::endl;
    std::cout << mat * vec << std::endl;    // 掛け算
    std::cout << mat + mat << std::endl;    // 足し算
    std::cout << mat - mat << std::endl;    // 引き算
    std::cout << mat.trans() << std::endl;  // 転置
    std::cout << mat.inv() << std::endl;    // 逆行列
    return 0;
}

3.2 ベクトルの演算

次の演算ができます.

次のメンバ関数を持ちます.

変数版はサイズの変更ができます.

3.3 行列の操作

次の演算ができます.
<ul>
    <li> +:和, -:差, *:積/定数倍, /:定数分の1
    <li> ==:比較, =:代入
    <li> <<:出力, >>:入力
</ul>
次のメンバ関数を持ちます.
<ul>
    <li> det(): 行列式を返す.
    <li> inv(): 逆行列を返す.
    <li> gauss(): ガウスの消去法で方程式を解く.
    <li> sub_matrix(): 部分行列への参照を返す.
    <li> row(): 行ベクトルへの参照を返す.
    <li> col(): 列ベクトルへの参照を返す.
</ul>
    sub_matrix()やrow()には値を代入することもできます.
    TMatrixRow<3,3,float> mat; TVector<3, float> vec;
    mat.row() = vec;

4 再配布の条件

再配布する場合は,原著作者の署名・連絡先を改変・削除しないでください. 閉鎖的な会社でソフトウエアを書く人にも自由に使用できるようにしたい ので,GPL・LGPLにしませんでした. もちろんGPL・LGPLに改変して再配布してくださっても結構です.

5 サポート

バグ,不具合,意味不明なコンパイルエラーなどを見つけた場合は, 長谷川 晶一 (hasevr あっと gmail.com) までご連絡ください. できる限りサポートし,より良いライブラリにしていくつもりです.
特にこのライブラリはテンプレートクラスライブラリなので,使用時に, 内部の動作が分らないと意味のわからないコンパイルエラーに出会うことも あると思います.そのような問題には対応するつもりですので,まずはご連絡ください.

6 謝辞

LU分解,逆行列,ガウス消去法などの行列計算アルゴリズムは,
「『C言語による最新アルゴリズム事典』全ソースコード」
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms
奥村 晴彦 Haruhiko Okumura
を改変して流用させていただきました. 自由にコードを使えるよう公開してくださってありがとうございます.