最新のWolfram言語には,このチュートリアルに関連する新機能が追加されている.最新情報は行列と線形代数を参照のこと.

行列の型

Wolfram言語の行列はWolfram言語が持つすべての型を使って形成できる.行列は機械精度の実数・浮動小数点複素数,任意精度の実数・浮動小数点複素数,整数,有理数,一般的な記号的数量を含むことができる.このチュートリアルではWolfram言語がサポートしているさまざまな型の行列について考える.

Wolfram言語における数

Wolfram言語が扱える行列の方について理解するためには,サポートされている数の型の概要を理解すると役立つ.このセクションではWolfram言語における数の概要についてのみ延べる.詳細は「数」を参照されたい.

機械サイズIntegerハードウェアで表される整数
Integer任意長の厳密整数
Rational既約の整数/整数(分数)
機械サイズRealハードウェアで表される近似実数
Real指定の精度による近似実数
Complex数+数Iという形式の複素数
AlgebraicNumber代数方程式の根
厳密な数式数の構成と数学関数
無限と例外種々の特殊な数

Wolfram言語における数の型

Wolfram言語には,これらすべての数の型を統括する計算システムが備えられている.多くの場合は2種類の整数が存在することは知る必要がない.なぜならこれらの2つの型は同様に使えるからである.例えば整数はハードウェアで表現される.これが2の10乗だと,結果はソフトウェアで表現される:
次の例は,機械精度の浮動小数点数の指数を計算すると,任意精度の数が返されることを示す:

これらの例は,機械数からソフトウェア数に切り換えられるように,Wolfram言語の計算がオーバーフローとアンダーフローをトラップする一般的な点を示している.しかし,Wolfram言語は計算が速くなるように,可能ならハードウェア機能を使おうとする.

厳密数と近似数

Wolfram言語の重要な問題のひとつに,Wolfram言語が厳密数と近似数を区別しているということがある.これはWolfram言語で記号計算をサポートするためのものである.次の例では,Sin関数を整数と実数の引数について比べる:

この結果から,Sin等の数学関数は入力の性質を維持することが分かる.引数が厳密数の場合は,結果は厳密数となる.引数が近時数の場合は,結果も近時数となる.Wolfram言語のこの機能は,システムを記号システムとして維持するために必須であり,完全に数値的な環境における操作とは異なる.例えば,CやJava等の多くの言語では,同様の計算では整数を倍精度にし,結果は近似値になってしまう.

この区別のため,数を扱う際は他の言語と比べてその型をよりよく認識しておかなければならない.

厳密数の数値近似はNを使って計算できる:

モード混在計算

もうひとつの重要な問題は,2つ以上の引数をとる関数の操作に関連している.この場合,Wolfram言語は入力の中でも最も精度の低いものを選ぶ.以下の例では,混在した計算において,すべての結果は近似値となっている:
入力がソフトウェアで表された厳密整数の場合にも同じことが言える:

Wolfram言語における行列

Wolfram言語では,行列はさまざまな異なる型の要素を含むことができる.

以下の例では,行列の各要素は機械精度の近似実数である:
次の行列は機械精度近似次数の実部と虚部を持つ複素数を含む:
次の行列は20桁精度の近時数を含む
次は整数の行列である:
次は有理数の行列である:
整数の実部と虚部を持つ複素数の行列である:
多項式の行列である:

このようなさまざまな型の行列は,計算に使われる技法に応じていくつかのカテゴリに分類できる.

機械精度Real標準数値技法
機械精度Complex
任意精度Real任意精度数値技法
任意精度Complex
Integer記号代数技法
Rational
厳密Complex
記号

Wolfram言語におけるさまざまな行列の型

以下でこの3つのカテゴリについて簡単に述べる.

標準数値技法

Wolfram言語では,機械精度のRealと機械精度の近似Complex数を含む行列の計算は標準の数的な技法で行われる.多くの場合,計算には最適化されたライブラリが使われる.ライブラリの多くについては「ソフトウェアの参考文献」で述べる.

これらの計算の多くは,機械性度数に特化したソフトウェアパッケージのいずれと比べても性能が同等以上であることを目標としている.これは「Wolfram言語の設計原理」のセクションで述べたように,Wolfram言語の設計目標と一致している.線形代数計算の場合,Wolfram言語では多量の高度な技術が使われる.そのいくつかについては「線形代数計算のパフォーマンス」で述べる.

任意精度数技法

Wolfram言語では,任意精度のRealと任意精度の近似Complex数を含む行列計算は特別な数値ライブラリを使って実行される.これらのライブラリは標準ライブラリから適合させたもので,任意精度の計算に使える.

詳細は「任意精度行列」で述べる.

記号代数技法

厳密数と一般的な記号技法を使った行列計算はコンピュータ代数技法を使って実行される.

数値的な行列のための計算はすべて,記号行列に付いても可能である.これは記号計算と数値計算を統合するという設計目標に合致している.

モード混在行列

このセクションでは,入力行列が複数の異なる型を含んでいる場合について述べる.

行列が数値でないもの(または数値に変換できないもの)を含んでいる場合,その行列は記号行列として扱われ,記号的な技法で計算が行われる.次の例では,xが存在することにより行列が記号的なものとして扱われ,結果は記号行列となる:
行列が数値(または数値に変換できるもの)のみを含んでいる場合,計算は最も低い精度において行われる.そのため,次の例では機械精度近似数1.の存在により,入力行列は機械性度数に変換され,機械精度技法で計算が行われる:
次の例では精度が最も低いのは20桁精度の数である.そのため,入力行列は20桁精度に変換され,任意精度技法を使って計算される:
結果の行列の要素は20桁精度である:
機械精度は任意精度数よりも精度が低いとみなされる.次の例には機械精度数が存在するため,入力行列は機械精度数に変換され,機械精度技法で計算される:
結果は機械精度行列となる:
これらの区別を認識しておくことは重要である.例えば,入力行列が整数で構成されている場合,記号代数技法で計算され,厳密精度の結果が返される:

他の計算システムによっては,入力の整数行列が浮動小数点行列に変換されることもある.これは,記号計算をサポートするためにWolfram言語では行われない.しかし,そのためにユーザは違いを認識しておく必要がある.これは記号技法に必要な時間が,機械精度技法に必要な時間と全く異なる可能性があるからである.多くの場合,記号技法の方がはるかに時間がかかる.

複素行列

Wolfram言語では,複素行列は実行列等の他の行列と完全に一貫した方法で定義されている.実行列に使える関数はすべて複素行列にも使える.

複素行列に特別な点のひとつに,実行列の転置を行う線形代数計算によっては,複素行列の共役転置を伴うということが挙げられる.これはコレスキー(Cholesky)分解で例示した.実対称正定値行列は次のように定義される:
複素エルミート正定値行列については次のように定義される:

任意精度行列

Wolfram言語の任意精度計算は,有意算法と呼ばれる計算形式をサポートしている.有意算法の基本的な考え方は,数値は精度で指定される誤差を含む近似値であるということである.計算の中で数値が使われると,結果の精度は関数の性質により異なることがある.以下に例として30桁精度の数を挙げる:
この数についてSin関数の値を求める:
結果は30桁精度より少ないように見える:
Wolfram言語では,一般に有意算法は線形代数計算には使われない.計算は固定精度で行われる.つまり,個々の演算の誤差を調べずに固定桁精度で計算されるのである.誤差の追跡はアルゴリズムレベルで行われ,例えば線形系の解が正しくない可能性があるときには警告を発する:
逆行列を計算すると,結果の行列は20桁精度の数で構成される: