![]() | ||||||||||||||||||||||||||||||||||||||||||||
|
行列タイプ | 説明 | double | Complex | 密 | 疎 |
---|---|---|---|---|---|
一般行列 | 最も基本的な行列で、2次元の配列と考えて差し支えありません。 以下の全ての行列タイプの要素を格納できます。 | ○ | ○ | ○ | ○ |
対称行列 | A[i,j]==A[j,i] という性質をもつ行列です。 対称ですので対角要素を含む上三角部分のみを保存します。 | ○ | ○ | ○ | ○ |
エルミート行列 | 複素数(Complex)専用の行列で A[i,j]==A[j,i]*という性質を持ちます。 対称行列と同様に対角要素を含む上三角部分のみを保存します。 A[j,i]*は A[j,i] の複素共役を意味します。 | - | ○ | ○ | ○ |
帯行列 | 対角要素周辺にのみ非ゼロ要素が存在する行列です。対角要素から一定の距離(上、下)以上の要素はゼロなので格納しません。 | ○ | ○ | ○ | - |
上三角行列 | 対角要素を含む上三角部分にのみ非ゼロ要素が存在する行列です。対角要素を含まない下三角部分の要素はゼロなので格納しません。 | ○ | ○ | ○ | ○ |
下三角行列 | 対角要素を含む下三角部分にのみ非ゼロ要素が存在する行列です。対角要素を含まない上三角部分の要素はゼロなので格納しません。 | ○ | ○ | ○ | ○ |
|
行列は [行列のタイプ数] * [double か Complex] * [密か疎] 通りの組み合わせがあります。
以下の例では同じ答えを得るのに3種類の行列(行列要素は3重対角)を使用して、連立方程式 A*x = b を解いています。
※実質的な違いは行列宣言部分だけで他は同じことに注目してください。結果は以下のようになります(Intel CORE i7-2600S 2.8GHz 8GBメモリ)。
※The Matrix Market にある巨大データ等の計算例は 行列データとベンチマーク (Let's 'C# で数値計算') を参照してください。 [5000元の線形連立方程式解法例]
int n = 5000; // 行列のサイズ VectorDenseDouble b = new VectorDenseDouble(n); // 定数ベクトル for (int i = 1; i <= n; ++i) b[i] = 1.0; // 値は全て 1.0 // 密な一般行列で A*x = b を解く using (MatrixDenseGeneralDouble A = new MatrixDenseGeneralDouble(n, n)) { for (int i = 1; i <= n; ++i) { A[i, i] = 2; if (i > 1) A[i - 1, i] = -1; if (i < n) A[i, i + 1] = -1; } DateTime time = DateTime.Now; LuSolver lu = LuSolver.Create(A); // 行列 A を因子分解する。 VectorDenseDouble x = lu.Solve(b); // 因子分解の結果を用いて A*x = b を解く Console.WriteLine("MatrixDenseGeneralDouble : " + (DateTime.Now - time)); Debug.Assert(_Mol.EQ(A * x, b)); // (A * x)==b を確認 lu.Dispose(); // lu は A と同サイズの因子分解結果行列を保持するので、積極的に破棄する。 } // 疎な一般行列で A*x = b を解く using (MatrixSparseGeneralDouble A = new MatrixSparseGeneralDouble(n,n)) { for (int i = 1; i <= n; ++i) { A[i, i] = 2; if (i > 1) A[i - 1, i] = -1; if (i < n) A[i, i + 1] = -1; } DateTime time = DateTime.Now; LuSolver lu = LuSolver.Create(A); VectorDenseDouble x = lu.Solve(b); Console.WriteLine("MatrixSparseGeneralDouble: " + (DateTime.Now - time)); Debug.Assert(_Mol.EQ(A * x, b)); lu.Dispose(); } // 帯行列(3重対角行列)で A*x = b を解く using (MatrixDenseBandDouble A = new MatrixDenseBandDouble(n, n, 1, 1)) { for (int i = 1; i <= n; ++i) { // 対角要素(を含む)の上下1要素(3重対角要素)以外に値を設定しようとするとエラー。 // 3重対角要素以外の要素を参照すると、値ゼロが返ります。 A[i, i] = 2; if (i > 1) A[i - 1, i] = -1; if (i < n) A[i, i + 1] = -1; } DateTime time = DateTime.Now; LuSolver lu = LuSolver.Create(A); VectorDenseDouble x = lu.Solve(b); Console.WriteLine("MatrixDenseBandDouble : " + (DateTime.Now - time)); Debug.Assert(_Mol.EQ(A * x, b)); lu.Dispose(); }
MatrixDenseGeneralDouble : 00:00:01.5350878 MatrixSparseGeneralDouble: 00:00:00.1160067 MatrixDenseBandDouble : 00:00:00.0020001行列の構造によって計算時間が極端に異なってきます。
詳細はリファレンス、プログラム例(C#)と解説はこちらを参照してください。
上記例では行列やベクトルの添え字(インデックス)は 1 から開始しています(デフォルト)。これは Mkl のベースが FORTRAN で記述されていることによります。 多くの数値計算関係の文献も 1 から開始するインデックスを採用しています。しかし、 _Array.IndexBase プロパティを設定することで C や C# と同じに 0 をインデックスの最初に指定することができます。
![]()
※Dll は全てアプリケーション(*.Exe)と同じ場所に置いてください。「Program Files」等のシステムフォルダは避けてください。
|
以下のドキュメント類が圧縮されています。
ヘルプファイル 説明 Mol.chm Microsoft Compiled HTML Help形式。Windows 98時代から使用されています。Viewer は Windows に付属しています。 Mol.mshc/Mol.msha Microsoft Help 3 や Microsoft Help Viewer 1.x とも呼ばれている最新形式です。 Mol.mshcはヘルプ内容の複数ファイルを標準の zip 形式に圧縮した形式です。 内容自体は任意の Web ブラウザで表示することができます。 ※関係するドキュメントは全て「ヘルプファイル」の形式で提供されます。
方法は
※MSHC 形式のヘルプは Visual Studio のヘルプコンテンツに登録できます。
- 同梱の Install_Mol.bat を実行する(HelpLibraryManagerLauncher.exe が登録処理を代行してくれます。逆は Remove_Mol.bat を実行します。)。
- Visual Studio 2010 のメニューで [ヘルプ]-[ヘルプ設定の管理]から「ディスクからコンテンツをインストール」を選択して登録します。 事前に Mol.msha を HelpContentSetup.msha という名前のファイルにコピーしてから、HelpContentSetup.msha を「Manifest file」に指定してください。
C# による簡単なソースプログラムとソリューションファイルです(解説)。
※例題は今後追加変更される可能性があります。
- ダウンロードしたらフォルダ付きで解凍してください。
- Dll 等のバイナリーファイルは別途ダウンロードしてから Program.cs と同じ場所に全てコピーしてください。
- Dll は Visual Studio が実行環境(Debug/Release等)にコピーするように設定してありますので確認してください。
- 解説と実行結果(抜粋)はこちらを参照してください。
※各例題の内容はソースプログラムとコメント等を参照してください。
Mol はクラスライブラリーです。利用者は開発ソフトウェア(EXEやDLL)から Mol の機能を利用できます。 Mol の正式利用にはライセンスを購入(購入方法)し、正しく設定する必要があります。
ライセンスはシリアル番号とライセンスキーからなります。
|
※重要※
ライセンス購入前に、必ずソフトウェア使用許諾契約書をお読みください。 ライセンスキーは代金入金確認後直ちに電子メール等でお知らせします。お客様は代金振り込みをもって「ソフトウェア使用許諾契約書」に同意したものとみなします。 |