MATLAB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
MATLAB(マットラブあるいはマトラボ、マトラブなど)は、アメリカ合衆国のMathWorks社が開発している数値解析ソフトウェア。日本での販売展開はサイバネットシステム株式会社が行っている。
MATLABは、MATrix LABoratoryを略したものであり、行列計算、ベクトル演算、グラフ化や3次元表示などの豊富なライブラリを持った、インタプリタ形式の高性能なテクニカルコンピューティング言語である。標準で数多くのライブラリを有しているが、それ以上のデータ解析や統計、アプリケーション展開などが必要な場合にはToolboxと呼ばれる拡張パッケージをインストールすることで、MATLABの機能拡張を図ることができる。MATLABとToolboxは総合してMATLABプロダクトファミリと呼ばれる。
MATLABを用いると、C言語やFORTRANといった従来のプログラミング言語よりも短時間で簡単に科学技術計算を行うことができる。
目次 |
[編集] 歴史
"MATrix LABoratory"の略であるMATLABは、1970年代後半に後にニューメキシコ大学コンピュータ科学学科長となるCleve Molerによって開発された。彼は、学生がFortranを学ぶことなくLINPACKやEISPACKにアクセスできるようにこのソフトを設計した。これはすぐに他の大学に広まってゆき、応用数学コミュニティの間で話題となった。エンジニアであるJohn N. Littleが1983年にMolerを訪ねた際にこれを見せられ、その商用的可能性に気づいた。彼らはMATLABをC言語で書き直し、開発を継続させるためにMathWorks社を1984年に設立した。これらの書き直されたライブラリは愛情を込めてJACKPACとして知られていた。MATLABは初めLittleの専門分野である制御工学で採用されたが、すぐに他の分野へと広まっていった。現在では、教育にも使用され、特に線形代数や数値解析の講義に使用される。
[編集] 構文
MATLABのMコード(もしくは単にm)は主に値指向である。JavaやC++といった静的型付けされる言語とは異なり、PHPやJavascriptと同様に変数自体は型を持たず、実行時に代入される値のみが型を持つ。
[編集] 変数
変数は代入演算子 '='で定義される。例として、
x = 17
はxという名の変数を定義すると同時に、その値に17という定数を代入した。型宣言はしていないがdouble型として扱われる。この例のような即値(数字で決め打ちされた定数)のほか、文字列定数、他の変数の値、または関数の出力を代入することができる。
[編集] ベクトル/行列
MATLABは "Matrix Laboratory"であるので、様々な次元の配列を作成するための多くの便利な方法を用意している。 他のプログラミング言語では一次元の行列(1×N or N×1)を一般的に「配列」として表現し、N×M、N×M×L(N、M、Lは1より大きい)のような多次元行列は「配列の配列」、「配列の配列の配列」として扱うが、MATLABでは区別なく「多次元配列」として表現するため、前者を特に「ベクトル」と呼び分けている。(PascalやModula-2のように、多次元配列的表記をサポートする汎用言語もある。)
MATLABには簡単な配列を定義する単純な構文がある。始端:
増加値:
終端がそれである。例えば、
array = 1:2:9 array = 1 3 5 7 9
はarray
という名の変数を定義し、これは1、3、5、7、9という数値からなる配列である。すなわち、配列は1(始端値)から始まり、それぞれの値は1つ前の値より2(増加値)増加し、9(終端値)以下に到達した時点で終了する。次の例のような代入文により、既に存在する変数array
の値を変更できる。要素数(配列のサイズ)も変更される。
array = 1:3:9 array = 1 4 7
増加値に1を使用する場合は、構文から(コロン1つとともに)省略することが出来る。
ari = 1:5 ari = 1 2 3 4 5
これは1、2、3、4、5という数値からなる配列である変数ari
を定義する。これは、増加値に初期値である1が使用されたためである。
[編集] セミコロン
セミコロン(';')はmではやや予想を裏切る使い方をする。JavaやC++などとは違い、コマンドの終わりは改行するだけでよく、セミコロンをつける必要は無い。その代わり、セミコロンをつけると各行からの出力を抑えることが出来る。セミコロンを行末につけなければ、標準出力に実行結果が表示される。実行結果の表示の必要な複数のコマンドを、改行せずに表現する場合はカンマ(',')を使用する。
逆に、一つのコマンドを複数行にまたがって記述する場合は、次の行へ続くことを意味する('...')を行末に付ける必要がある。
[編集] コード例
magic.mから引用した以下のコードは奇数値nの魔方陣Mを作成する。
[J,I] = meshgrid(1:n); A = mod(I+J-(n+3)/2,n); B = mod(I+2*J-2,n); M = n*A + B + 1;
このコードは"for"ループを使用することなくベクトルや行列の操作を行っているということに注意するべきである。慣用的に、MATLAB言語はふつう配列全体を同時に処理する。上記MESHGRIDユーティリティ機能は以下のような配列を作成する。
J = 1 2 3 1 2 3 1 2 3 I = 1 1 1 2 2 2 3 3 3
多くのスカラー関数は配列に使用することができ、配列の要素毎に並行して作用する。そのため、mod(2*J,n)は、配列 J に2をスカラー的に乗算(各要素を2倍)した後、要素毎に nの剰余を計算する。
MATLABには標準的な"for"や"while"が実装されているが、MATLABのベクトル式記法を使用する方がしばしばコードの可読性をあげ実行速度を速くする。
[編集] ジョーク
MATLABを起動してコマンド行に"toilet"や"why"と入力するとちょっとおもしろいことが起きる。"toilet"はトイレのシステムをシミュレートするプログラムを実行する。"why"プログラムは実行するたびに違った答えを返すプログラムである。 (MatLab7.3では"toilet"コマンドは働かないようであった)
[編集] 批判
MATLAB自体はMathWorks社のプロプライエタリな製品である。CやFORTRANといった一般的なプログラミング言語と違い、MATLAB言語はANSIのようなサードパーティの標準化組織によって管理されていない。完全な互換性や最新版のMATLABを得るためには、製品を購入する必要がある。いくつかのプログラムではMATLABプログラミング言語の大部分を実行することが可能だが、100%の互換性を持つものや様々な分野別のツールを含むものはない。結果的に、MATLABの利用者はベンダの囲い込みに属することとなる。
MATLABは元々はFORTRANにより実行され、後にCで書き直された。この二つの言語の性格を受け継いでいるため、時として常軌を逸した構文を生み出すことになる。CでもFORTRANでもどちらでもなく、それら2つを混ぜ合わせたものである。この混合構文は解釈の問題を引き起こす可能性がある。例えば、
y = f(x)
は、引数xを持つ関数fと、行列fのインデックスxの要素(x番目の要素)のどちらをも表す。この曖昧な構文は手続きとテーブル検索の切り替えを容易にし、どちらも数学的機能と一致するが、元の意図を汲むためには注意深くコードを読む必要がある。似たような問題が演算子 *と 'の扱いを複雑なものにしている。
他にもデータ型が存在しない訳ではないが、デフォルトはdouble型の行列である。これは単に数の配列にすぎず、工学的な単位やサンプリング周波数といった実用データとして要求される属性を欠いている。SP3には時間系列オブジェクトとして日時のマーカが加えられたが、サンプリング周波数情報の欠如は、一定周期でデータを標本化することが一般的な信号処理アプリケーションとしては大きな欠点となる。これらの属性は利用者が自分でプログラムを書いて管理しなければならず、失敗の原因となり、時間をとる。
MATLABの行列型におけるもう一つの批判は、各次元のインデックスが常に1から始まるように決め打ちされている点についてである。このため、文献から得た通常の概念をそのまま利用することができず、非標準的な方法に再定義しないといけない。よくある例は離散フーリエ変換(DFT)である。通常、次のように定義される。
また、逆変換(IDFT)は、
- .
MATLABではインデックスを0にすることも負にすることもできないので、MATLABではそれぞれを次のように定義することになる。
- .
MATLABでは負のインデックスが許されないので、非因果的な系(インパルス応答が負の時刻において0以外の値をとる)を分かりやすくモデル化することができない。MATLABの最も一般的な単独のアプリケーションはデジタル信号処理であろうが、これら二つの制約によって、MATLABはその分野のアルゴリズムを記述するためには魅力ある選択肢とは言いにくい。
MATLABは手続き型言語の一つであるから(ある程度オブジェクト指向も取り入れられている)、入力の変化に伴って変数の値が自動的に更新されることはない。ところがシミュレーションや探索的データ解析ではこの機能が要求されている。例えば次のようなプログラムの断片を考えてみる。
t = 1:100; y = log(t);
もし変数tが t = 100:1000 のように変更されたとしたら、新しい結果を得るためにyを再計算しなければならない。 MathWorks はシステムのモデル化やシミュレーションにおいてこれらの作業の一部を自動化する追加パッケージSimulinkを提案している。
MATLAB は参照を持たないため、オープンハッシュテーブル、線形リスト、木構造やその他計算機科学で一般的に用いられる間接参照を含むデータ構造を実装するのは困難である。さらにこれは、オブジェクトの使用が煩わしいものにしている原因でもある。 オブジェクトに変化がある度に、現在のオブジェクトを変えるのではなく新たなオブジェクトが生成されてしまう(this や self はコピーオンライトである)。オブジェクトのプロパティを変更する唯一の方法は、古いオブジェクトを新しいオブジェクトで上書きすることである。すなわち、他のオブジェクト指向言語で
obj.do_something();
とするようなところを、
obj = do_something(obj);
と書かなければならない。
いくつかの競合ソフトウェアも出現しているが、これらの短所にも関わらず、MATLAB は依然多くの科学技術計算で用いられている。
[編集] 関連項目
- 数値解析
- MATLABに似たプログラムの一覧は数値解析ソフトウェアを参照
- Toolboxesとその他のアドオン
- Simulink
- Stateflow
- Psychtoolbox
- [NAG Foundation Toolbox for MATLAB]
[編集] 外部リンク
- MathWorks社のMATLAB製品ページ
- MATLAB Central(MATLABユーザコミュニティ)
- Open Directory ProjectのMATLABカテゴリ
- Cleve Molerによって書かれた、MATLABの歴史に関する追加の情報
- comp.soft-sys.matlab
- オンラインでのMATLABコードの共有
- MATLAB Syntax Colorizer
- literateprograms.orgのMATLAB
カテゴリ: 翻訳中 | 自然科学関連のスタブ項目 | 数値解析ソフトウェア