Yamamoto's Laboratory
 
 
クラスの例
 matrix
 
ライブラリー
 
 
コンピューター C++ クラスの例(matrix)

C++クラス::matrix行列に関する演算ができるクラス

数値演算のプログラムでは行列演算が多用されます.そこで,行列のクラスを作成しました.

目次


概要

動機

通常の行列を含む数値計算では,二次元配列を使います.スタックに配列を確保すると要素サイズを変更ができないので,ヒープにメモリーを確保することになりますが,結構面倒です.そこで,簡単に動的メモリを二次元配列として確保し,行列の演算をするクラスが欲しくなります.ここで示すクラスは,プログラムの中で要素サイズを決定できて,添字が1からnまでの二次元配列を提供します.要素は double型で,様々な演算も提供します.

具体的な問題

数値計算を行う上でC/C++言語の配列には,いくつかの問題点があります.n個の要素を持つ配列の添字は0から始まり,n-1で終ります.それに対して,数学の添字は 1 から始まります.これは,数式からプログラムを書くときに,ややっこしくて仕方ないです.さらに,行列のサイズの確保にも問題があります.次にように,プログラムの実行中にサイズを決定できません.

int n;
cin >> n;
double a[n][n];    // nが変数のためエラー

動的に確保することも可能ですが,やや面倒です.

しかし,ここで示す Matrix クラスを使うと,このような問題を解決することができます.以下のように,クラスを宣言すれば,n×nの二次元配列 (正方行列) になります.添字 (インデックス) は,1–n です.

int n;
cin >> n;       // nは変数
Matrix a(n, n);  // a[1][1]からa[n][n]までの配列(正方行列)

行列の積なども演算子を使って計算できます.

a = b*c;    // 行列 b と c の積を計算し,行列 a に代入する

実際のクラス (Matrix)

インクルード

Matrixクラスは,matrix.hをインクルードすれば使える.

#include "matrix.h"

とすればよい.必要なファイルは,以下の通りである.

matrix.h ヘッダーファイル
matrix.cpp クラスのソースファイル

定義

以下のように定義する.

Matrix m(row, col);

引数の,row, colはint型である.このように定義すれば,mは row行,col列の行列となる.

また,引数を省略することもできる.この場合は,1行,1列の行列となる.

Matrix m;  // 要素は m[1][1] だけ

また,全ての要素には 0 が入っている.

要素へのアクセス

要素へのアクセスは,普通の二次元配列と全く同じである.ただし,要素は double 型である.また,要素の添字として 0 は使えない.例えば以下のようにできる.

int row=5, col=10;
Matrix m(row, col);
for(int i=1; i<=row; i++){
  for(int j=1; j<=col; j++){
    m[i][j] = 10.0*i*j;
  }
}
m[1][1] = m[3][2] + m[5][10];

添字が 1 から始まることを除けば,普通の2次元配列と変わりない.

演算子について

代入 (=)

a = b;   // aにbを代入

Matrix型をMatrix型に代入する.このとき,行数,列数,要素の内容がコピーされる.

定数倍 (*)

double k=2.0;
a = k*a;

Matrix a の要素全てを k 倍 (2倍) している.

行列の加減算 (+, -)

c = a+b;

全ての要素について,a[i][j]+b[i][j]が計算されて,c[i][j]となる.減算- も同じように計算される.ただし,この演算は,a,bの行数,列数が同じ大きさでないといけない.

行列の積 (*)

c = a*b;

行列a と 行列b の積が計算される.当然この場合は,aの列数とbの行数は一致していないといけない.aの行数をi, bの列数をjとすると.cはi行j列になる.

その他の機能

行と列が同じ大きさの場合に,次のようにすると単位行列をつくる.

Matrix a(3,3);
a.unit_matrix();   // これでaは単位行列になった

転置行列をかえすメンバー関数も持っている.

b = a.transposed();    // これでbはaの転置行列になった

このようにするとbがaの転置行列になる.

ページ作成情報

参考資料

更新履歴

2007年頃 新規作成


no counter