ルギア君の戯言

雑多な記事。

行列の計算

また授業で行列に関する計算のプログラムを組む実習があったので、機能を追加しました。

※このプログラムは数学の定義どおり実装のため速くはありません。ご注意を。

内容をまとめておきます。

#include "matrix.h"

...(中略)...

double d;
int    i;

/* 初期化方法 */
matrix<double> A;           // 空行列を作成
matrix<double> B(2, 2);     // 2 x 2 行列を作成
matrix<double> C(3);        // 3 次の行ベクトルを作成
matrix<double> D(&(d[0][0]), &(d[2][2]), 3);
                            // d[0][0] から d[2][2] の内容を用いて 3 x 3 行列を作成
                            // 最終引数は行方向の大きさを指定する

/* 値設定方法 */
A.push_back(1.0);           // vector とおなじ方法 (matrix は vector の派生物)
B[2] = 1.0;                 // 同上 (プログラム的にはあまり意味をなさない)
D(2, 2) = 3.0;              // (3, 3) 成分に 3 を代入 (先頭の成分は 0)
A.setXsize(2);              // 行方向の大きさの設定

/* 値取得方法 */
d = A.pop_back();           // vector とおなじ方法 (末端が削除されてしまいます)
d = B[0];                   // 同上 (ベクトルにならない点に注意)
d = C(0, 1);                // (1, 2) 成分を取得
i = getXsize();             // 行方向の大きさを取得
i = getYsize();             // 列方向の大きさを取得 (全体の長さ / 行方向の長さ)

/* 基本計算 */
A = B + C;                  // 加算
A = B - C;                  // 減算
A = B * C;                  // 積算 (大きさと順番に注意)
A = B * 2.0;                // スカラー倍

/* 基本変形 */
A = B.BasicRowP(0, 1);      // 行基本変形1 (0行目と1行目を入れ替え)
A = B.BasicRowQ(1, 0.5);    // 行基本変形2 (1行目を 0.5 倍)
A = B.BasicRowR(1, 2, 0.5); // 行基本変形3 (1行目に 2行目の 0.5倍を加算)
A = B.TransStair();         // 階段行列変形

/* その他 */
A = B.Transpose();          // 転置
A = B.Power(3);             // 累乗 (誤って -1 を入れぬよう unsigned してあります)

A = matrix<double>::E(3);   // 3 x 3 の単位行列 (static です)

ダウンロード

さすがにソースが長くなって来たので、ダウンロード提供します。


VC++ でも使えるはずですが、確認していません。


matrix.h-1.1.0.tar.gz


このソースは完全フリーです。煮たり焼いたり、他の人にあげたり、売ったりしてもかまいません。ただし、利用は自己責任でお願いします。


サンプルプログラムを2つ入れておきました。過去に作ったやつなので、権限とかまちまちだったりしますが気にしないで使ってください(駄

jan:4961310070359