行列の型
Wolfram言語の行列はWolfram言語が持つすべての型を使って形成できる.行列は機械精度の実数・浮動小数点複素数,任意精度の実数・浮動小数点複素数,整数,有理数,一般的な記号的数量を含むことができる.このチュートリアルではWolfram言語がサポートしているさまざまな型の行列について考える.
Wolfram言語における数
Wolfram言語が扱える行列の方について理解するためには,サポートされている数の型の概要を理解すると役立つ.このセクションではWolfram言語における数の概要についてのみ延べる.詳細は「数」を参照されたい.
| 機械サイズInteger | ハードウェアで表される整数 |
| Integer | 任意長の厳密整数 |
| Rational | 既約の整数/整数(分数) |
| 機械サイズReal | ハードウェアで表される近似実数 |
| Real | 指定の精度による近似実数 |
| Complex | 数+数Iという形式の複素数 |
| AlgebraicNumber | 代数方程式の根 |
| 厳密な数式 | 数の構成と数学関数 |
| 無限と例外 | 種々の特殊な数 |
int1 = 2^10int1^10Exp[-6000.]これらの例は,機械数からソフトウェア数に切り換えられるように,Wolfram言語の計算がオーバーフローとアンダーフローをトラップする一般的な点を示している.しかし,Wolfram言語は計算が速くなるように,可能ならハードウェア機能を使おうとする.
厳密数と近似数
Sin[ 5]Sin[5.]この結果から,Sin等の数学関数は入力の性質を維持することが分かる.引数が厳密数の場合は,結果は厳密数となる.引数が近時数の場合は,結果も近時数となる.Wolfram言語のこの機能は,システムを記号システムとして維持するために必須であり,完全に数値的な環境における操作とは異なる.例えば,CやJava等の多くの言語では,同様の計算では整数を倍精度にし,結果は近似値になってしまう.
この区別のため,数を扱う際は他の言語と比べてその型をよりよく認識しておかなければならない.
exact = Sin[5];
inexact = N[exact]モード混在計算
5 + 6.7Sin[5] / 1.51.5 2^100Wolfram言語における行列
Wolfram言語では,行列はさまざまな異なる型の要素を含むことができる.
{{1.5, 2.7}, {3.1, 4.3}}//MatrixForm{{1.5 + 4.5I, 2.7 + 4.I}, {3.1 + 2.1I, 4.3 + 5.1I}}//MatrixForm{{1.5`20, 2.7`20}, {3.1`20, 4.3`20}}//MatrixForm{{1, 2}, {3, 4}}//MatrixFormTable[1 / Random[Integer, {3, 10}], {4}, {4}]//MatrixForm{{1 + 4I, 2 + 2I}, {3 + 1I, 4 + 11I}}//MatrixFormTable[ Sum[i x^i, {i, 0, 2 + Mod[m, n]}], {m, 4}, {n, 4}]//MatrixFormこのようなさまざまな型の行列は,計算に使われる技法に応じていくつかのカテゴリに分類できる.
標準数値技法
Wolfram言語では,機械精度のRealと機械精度の近似Complex数を含む行列の計算は標準の数的な技法で行われる.多くの場合,計算には最適化されたライブラリが使われる.ライブラリの多くについては「ソフトウェアの参考文献」で述べる.
これらの計算の多くは,機械性度数に特化したソフトウェアパッケージのいずれと比べても性能が同等以上であることを目標としている.これは「Wolfram言語の設計原理」のセクションで述べたように,Wolfram言語の設計目標と一致している.線形代数計算の場合,Wolfram言語では多量の高度な技術が使われる.そのいくつかについては「線形代数計算のパフォーマンス」で述べる.
任意精度数技法
Wolfram言語では,任意精度のRealと任意精度の近似Complex数を含む行列計算は特別な数値ライブラリを使って実行される.これらのライブラリは標準ライブラリから適合させたもので,任意精度の計算に使える.
詳細は「任意精度行列」で述べる.
記号代数技法
厳密数と一般的な記号技法を使った行列計算はコンピュータ代数技法を使って実行される.
数値的な行列のための計算はすべて,記号行列に付いても可能である.これは記号計算と数値計算を統合するという設計目標に合致している.
モード混在行列
このセクションでは,入力行列が複数の異なる型を含んでいる場合について述べる.
mat = {{1., Sin[4]}, {1, x}};
Inverse[mat]mat = {{1., Sin[4]}, {1, 2}};
Inverse[mat]mat = {{1.`30, 1.`20}, {1, 2}};
Inverse[mat]Precision[%]mat = {{1.`5, 1.`20}, {1.5, 2}};
Inverse[mat]Precision[%]mat = {{1, 3}, {4, 2}};
Inverse[mat]他の計算システムによっては,入力の整数行列が浮動小数点行列に変換されることもある.これは,記号計算をサポートするためにWolfram言語では行われない.しかし,そのためにユーザは違いを認識しておく必要がある.これは記号技法に必要な時間が,機械精度技法に必要な時間と全く異なる可能性があるからである.多くの場合,記号技法の方がはるかに時間がかかる.
複素行列
Wolfram言語では,複素行列は実行列等の他の行列と完全に一貫した方法で定義されている.実行列に使える関数はすべて複素行列にも使える.
mat = {{11., 3.}, {3., 5.}};
matG = CholeskyDecomposition[mat];
Transpose[matG].matG//MatrixFormmat = {{11., 3. + 2.I}, {3. - 2.I, 5.}};
matG = CholeskyDecomposition[mat];
Conjugate[Transpose[matG]].matG//MatrixForm任意精度行列
num = N[ Pi + 10^-20, 30]Sin[num]Precision[%]mat = Table[Random[ Real, {-1000., 1000}, 20], {4}, {4}];
Inverse[mat]Min[Map[ If[# == 0, Accuracy[#], Precision[#]]&, %, {-1}]]関連するテクニカルノート
-
▪
- Wolfram言語における線形代数 ▪
- 行列とテンソルの操作 ▪
- 疎行列(スパース行列)を使う ▪
- 行列の計算 ▪
- 行列の型