簡易ベクトル・行列演算ライブラリ
これは何?
2004年夏学期の講義の課題で作成した、ベクトル・行列の演算プログラムに
少しばかり手を加えたものです。プログラミング言語はC言語です。
その際のレポートを HTML 化したものは
matrix.html
として置いておきます。
アーカイブ
使い方
ベクトルを扱うものに関しては vector.c に、行列を扱うものに関しては
matrix.c に、行列とベクトルを扱うものに関しては matrixvector.c に
記述してあります。それぞれどんな関数かはヘッダーファイルのコメントを
みるとざっとつかめると思います。これらの関数を自分のプログラムで
使いたい場合は、同じディレクトリにファイルを置いた上で
「#include "matrix.h"」などと書いてヘッダーファイルを
インクルードしてください。もちろん他の方法でインクルード
しても構いません。
テストプログラムとして、課題で作ったものも入れてあります。
make した後にできた calculate を実行してみてください。
乱数で発生させた連立1次方程式に対して精度保証つきの解を表示します。
特徴
- 2次元配列は通常、関数への受け渡しの際に列のサイズを定数で渡さないといけないという欠点を解消しています。
- 行列の記憶領域確保の方法を工夫したので、行の入れ換えが高速にできます。
- 定数倍や線形和、内積や外積、行列積や転置など、基本的な操作関数が実装済みです。
- 部分ピボット選択ありの LU 分解を実装しました。これを用いて逆行列や連立一次方程式の解が(場合によっては効率的に)求められます。
- とりあえずC言語かつスピード重視実装なのでそれなりに速いです。
制限事項
- QR分解は未実装です。
- 固有値も求められません。
- 特異値分解も未実装です。(誰かやって)
- コメントは日本語です。英語は苦手なのです。
- プログラムの書き方が一貫していません。(書き直すの面倒)
- 人によっては関数の名前が気に入らないかもしれません。
- 1024 x 1024 の行列でもう計算量的にいっぱいいっぱいな感じです。
- 入力だけでなく計算される数値が全て double 型の範囲に収まるようにお願いします。(どうしろと)
現改善案
- 0 になったかの判断は、0との差をマシンイプシロンで見るべき?
- vector や matrix という、使い勝手のよい構造体を作るべき?
連絡・報告
何かお気づきの点や連絡事項などありましたら
メール
でお知らせくださいませ。