クラスの例
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 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の転置行列になる. ページ作成情報参考資料更新履歴
|