Wolfram言語における線形代数入門
Wolfram言語は線形代数操作をサポートし,それらの操作をシステムに組み込むための広範に渡る関数を有している.Wolfram言語は機械精度の浮動小数点数,任意精度の浮動小数点数,複素浮動小数点数,整数,有理数,一般の記号的数量を含んでいるベクトル,行列,テンソルを処理することができる.線形代数操作については,これらすべての型を要素として持つ行列に対してサポートされている.
Wolfram言語は密行列,疎行列(スパース行列)ともにサポートしているが,本ドキュメントの冒頭では密行列に焦点を当てる.疎行列については「疎行列(スパース行列)を使う」で述べる.一般に,密行列に対して可能な操作は,疎行列に対しても同様に可能である.
Wolfram言語では,行列はリストで表される.Wolfram言語でリストを表す{ }表記を使って直接入力できる.
Tableを使ってプログラムで作成することもできる.
MatrixFormを使うと,行列の構造が明らかになる.
行列は線型方程式系を効率よく表すことができるため,多くの分野の計算において重要な道具となっている.行列を使うと数の配列が効率よく処理できるため,多くのコンピュータアプリケーションにおいても行列を使うことができる.更にWolfram言語では,行列が表す線形方程式系を直接処理することもできる.以下の例では,行列に未知数ベクトルを掛け合せ,方程式系を形成する.
この方程式系は代数方程式ソルバであるSolveコマンド使って解くことができる.
また,方程式の行列表現はLinearSolveコマンドを使って直接解くこともできる.
行列と,それが表す線形系との間の変換は,根底の原理の理解に役立つ.どちらかを使って特定の問題を設定すると便利なこともある.
テンソルと配列
行列には,各要素を表す2つの指標がある.慣例に従い,これらの指標は,行列を表形式で表した場合の行と列を表す.一般化された行列の指標は2つより少ないことも,2つより多いこともある.一般に指標のないオブジェクトをスカラーと呼び,指標を1つ持つものをベクトルと呼ぶ.スカラー,ベクトル,行列もテンソルと呼ぶこともできるが,3つ以上の指標を持つオブジェクトをテンソルと呼ぶ.
Wolfram言語では,行列に使うのと同じリスト構造を使って,任意の数の指標を持つテンソルの操作が可能である.リストのレベルの数が指標の数を表す.以下にベクトルの例を示す.
次は3つの指標を持つテンソルの例である.長さはそれぞれ2,3,4である.テンソルを表すのに必要な指標の数は,テンソルの階数と呼ばれる.
物理分野で使われるテンソル表記には,一般化された行列において各要素を表すということ以外に,別の特性が加えられていることに注意が必要である.このことについては MathWorld のテンソルの項目により詳しく記されている.Wolfram言語ではテンソルという言葉は一般化された行列を表す.
行列に対して使用できる Wolfram言語関数の多くは,ベクトルとテンソルについても使用できるように一般化されている.これは重要な原理であり,このドキュメントの中でも何度も登場する.これについては「行列とテンソルの操作」で述べる.
Wolfram言語式としての行列
Wolfram言語の行列の重要な特徴のひとつに,それがWolfram言語式であるということがある.これはWolfram言語式について使用できるWolfram言語コマンドは,行列に対しても使えるということである.これはベクトルとテンソルにも当てはまる.Wolfram言語ではすべてのオブジェクトの式の構造が共通であり,それによってWolfram言語プログラミングにおける表現が格段に豊かになる.この原理はWolfram言語の基礎原理と呼ばれることがあるが,純粋な数値的プログラミングの経歴がある人にとっては抽象的で面白味がなく,分かりきったことのように思えるかもしれない.しかし,オブジェクト指向プログラミングの知識がある方には,共通の親オブジェクトを使うことの利点がお分かりいただけるだろう.このセクションではこの原理の例を取り上げる.
Wolfram言語式を理解する重要な方法のひとつに関数FullFormを使うという方法がある.この関数はWolfram言語で式がどのような構造になっているのか,その詳細を示す.次の例の場合,行列の木構造が示される.一番外側にはノードがあり,この場合それはListである.Wolfram言語ではこれを「頭部Listを持つ」と言う.一番外側のノードは2つの引数を持っている.そのそれぞれが頭部Listを持ち,3つの整数引数を持っている.
行列の式の頭部は関数Headを使って調べることができる.
Lengthで行列の式の引数の数を求める.
Partを使って式の要素を抽出する.
Wolfram言語でのFullForm,Head,Length,Part等の操作は,どのようなWolfram言語式についても使える.これは,共通のプログラミング構造一式が,線形代数だけではなく異なる多くの分野に使えるということであり,大変便利である.同じ技術がグラフィックスプログラミング,ドキュメントプログラミング,記号的代数プログラミング等Wolfram言語の他の多くの分野にも適用できる.このような操作はWolfram言語式の構造について行われるものなので,よく構造操作と呼ばれる.これらは線形代数に特化した他の操作とは対照的である.例えば関数MatrixQは行列の計算に特化している.
式の入出力
Wolfram言語には式の入出力のためのコマンドがある.また,特別な形式のデータにも多くの入出力用コマンドが用意されている.形式付きデータに使えるコマンドは「行列のインポートとエキスポート」で述べる.このセクションでは式の入出力のためのWolfram言語コマンドを復習する.
Wolfram言語のFullFormの概念は,JavaやC#の直列化(シリアライズ)可能なオブジェクトの概念と全く同じである.Wolfram言語式のFullFormはすべて,式の完全形である.FullFormをファイルに保存して閉じて再び開くと式が再構築される.
Wolfram言語式はコマンドPutの簡略表記>>を使ってファイルに保存できる.
ファイルの内容はFilePrintを使って確認できる.
ファイルはGetの簡略表記<<を使ってWolfram言語に再び読み込むことができる.
行列がファイルから読み込まれる.これはその後の計算に使える.
行列についてWolfram言語で入出力を行うもうひとつの方法に,Wolfram Symbolic Transfer Protocol (WSTP)を使うというものがある.これは他のWolfram言語セッションとの間の通信において特に便利なプロセス間通信メカニズムである.
Wolfram言語で作業中の行列をファイルに保存し,後で読み込む予定なら,PutとGetを使うのが最も便利である.行列を他のアプリケーションとの間で交換したい場合は,一般的な形式でデータを保存するほうがよいだろう.これについては「行列のインポートとエキスポート」で述べる.
Wolfram言語の設計原理
線形代数のサポートにより,数々の重要なWolfram言語の設計原理が分かる.