MATLAB

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
MATLAB
Matlab Logo.png
開発元 The MathWorks
最新版 R2013b / 2013年09月11日(12か月前) (2013-09-11
プログラミング言語 C言語,Java
対応OS Microsoft Windows
Mac OS X
Linux[1]
iOS[2]
Android[2]
種別 数値解析ソフトウェア
ライセンス プロプライエタリ
公式サイト MathWorks 日本MATLAB 製品ページ
テンプレートを表示

MATLAB(マトラブ)は、アメリカ合衆国MathWorks社が開発している数値解析ソフトウェアであり、その中で使うプログラミング言語の名称でもある。

概要[編集]

MATLABは、MATrix LABoratoryを略したものであり、行列計算、ベクトル演算グラフ化や3次元表示などの豊富なライブラリを持った、インタプリタ形式の高性能なテクニカルコンピューティング言語、環境としての機能を持つ。標準で数多くのライブラリを有しているが、それ以上のデータ解析や統計、アプリケーション展開などが必要な場合にはToolboxと呼ばれる拡張パッケージをインストールすることで、MATLABの機能拡張を図ることができる。MATLABとToolboxは総合してMATLABプロダクトファミリと呼ばれる。

MATLABを用いると、C言語FORTRANといった従来のプログラミング言語よりも短時間で簡単に科学技術計算を行うことができる。類似フリーウェアにScilabGNU OctaveFreeMatなどがある。

また、iPhoneiPod (iPod touch)、Androidで動作するアプリ「MATLAB Mobile」もある[2]

歴史[編集]

"MATrix LABoratory"の略であるMATLABは、1970年代後半、後にニューメキシコ大学コンピュータ科学学科長となるCleve Molerによって開発された。彼は、学生がFortranを学ぶことなくLINPACKEISPACKにアクセスできるようにこのソフトを設計した。これはすぐに他の大学に広まってゆき、応用数学コミュニティの間で話題となった。エンジニアであるJohn N. Littleが1983年にMolerを訪ねた際に、これを見せられてその商用的可能性に気づいた。彼らはMATLABをC言語で書き直し、開発を継続させるためにMathWorks社を1984年に設立した。これらの書き直されたライブラリは愛情を込めてJACKPACとして知られていた。MATLABは初めLittleの専門分野である制御工学で採用されたが、すぐに他の分野へと広まっていった。現在では、教育にも使用され、特に線形代数数値解析の講義に使用される。

Matlab R2008a より、インストールの際に、インターネットを通じたライセンス認証を導入した。

日本での展開[編集]

1988年より、日本での販売展開はサイバネットシステム株式会社が代理店業務を行っていた。しかし、2009年7月1日から販売代理店業務がMathWorks Japan(MathWorks社の日本法人)に移管された。

毎年11月から12月にサイバネットシステムが「MATLAB EXPO」を開催していたが、上記の移管により、2009年からはMathWorks Japanがその開催を主催する。近年では会場として東京都港区台場地区のホテルグランパシフィック・ル・ダイバ(Grand Pacific Le Daiba)にて開催されている。その規模はMATLABユーザカンファレンスとしては世界最大の規模を誇り、一日の来場者は2000人を超える。単一ツールとしてのカンファレンスとしても他に類を見ないほどの規模である。

バージョン[編集]

2012年2月現在、R2006a以降、MathWorks社は、MATLABプロダクトファミリーのリリースを3月と9月の年2回定期的に行っている。バージョン名の付け方は、3月もしくは4月のリリースは"西暦"+"a"、9月もしくは10月のリリースは"西暦"+"b"である[3]

自分が使用しているMATLABプロダクトファミリーのバージョンを確かめる場合、コマンドウィンドウ上で「verコマンド」を使用すればよい。これによって、現在使用しているMATLABプロダクトファミリーのバージョン、ライセンスナンバー、簡単なパソコンの状況、インストールされているTooloxとBlocksetおよびSimulinkの一覧とバージョンが表示される。

MATLABプロダクトファミリー バージョン
リリース名 MATLAB本体 Simulink, Stateflow
R12 6.0 2000
R12.1 6.1 2001
R13 6.5 2002
R13SP1 6.5.1 2003
R13SP2 6.5.2
R14 7 6.0 2004
R14SP1 7.0.1 6.1
R14SP2 7.0.4 6.2 2005
R14SP3 7.1 6.3
R2006a 7.2 6.4 2006
R2006b 7.3 6.5
R2007a 7.4 6.6 2007
R2007b 7.5 7.0
R2008a 7.6 7.1 2008
R2008b 7.7 7.2
R2009a 7.8 7.3 2009
R2009b 7.9 7.4
R2010a 7.10 7.5 2010
R2010b 7.11 7.6
R2011a 7.12 7.7 2011
R2011b 7.13 7.8

構文[編集]

MATLABのMコード(もしくは単にm)は主に値指向である。JavaC++といった静的型付けされる言語とは異なり、PHPJavaScriptと同様に変数自体は型を持たず、実行時に代入される値のみが型を持つ。

変数[編集]

変数は代入演算子 '='で定義される。例として、

x = 17

はxという名の変数を定義すると同時に、その値に17という定数を代入した。型宣言はしていないがdouble型として扱われる。この例のような即値(数字で決め打ちされた定数)のほか、文字列定数、他の変数の値、または関数の出力を代入することができる。

ベクトル/行列[編集]

MATLABは "Matrix Laboratory"であるので、様々な次元の配列を作成するための多くの便利な方法を用意している。他のプログラミング言語では一次元の行列(1×N or N×1)を一般的に「配列」として表現し、N×MN×M×LNMLは1より大きい)のような多次元行列は「配列の配列」、「配列の配列の配列」として扱うが、MATLABでは区別なく「多次元配列」として表現するため、前者を特に「ベクトル」と呼び分けている(PascalModula-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が使用されたためである。

セミコロン[編集]

セミコロン(';')は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"はトイレのシステムをシミュレートするプログラムを実行する。このプログラムはSimulinkで組まれており、実行にはSimulinkが必要。なお、このファイルはSimulinkのデモで、「Tank Fill and Empty with Animation(日本語バージョン:アニメーションを使った水槽の水量変化)」として収録されている。MATLAB7.3では"toilet"コマンドは働かないようであったがMATLAB7.4では再び"toilet"コマンドは働くようになった。 "why"プログラムは実行するたびに違った答えを返すプログラムである(イースター・エッグ (コンピュータ))。

批判[編集]

MATLAB自体はMathWorks社のプロプライエタリな製品である。CFORTRANといった一般的なプログラミング言語と違い、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)である。通常、次のように定義される。

X_k = \sum_{n=0}^{N-1} x_n e^{-\frac{2 \pi i}{N} k n} \quad \quad k = 0, \dots, N-1

また、逆変換(IDFT)は、

x_n = \frac{1}{N} \sum_{k=0}^{N-1} X_k e^{\frac{2\pi i}{N} k n} \quad \quad n = 0,\dots,N-1.

MATLABではインデックスを0にすることも負にすることもできないので、MATLABではそれぞれを次のように定義することになる。

X_k = \sum_{n=1}^{N} x_n e^{-\frac{2 \pi i}{N}(k-1)(n-1)} \quad \quad k = 1, \dots, N

x_n = \frac{1}{N} \sum_{k=1}^{N} X_k e^{\frac{2\pi i}{N}(k-1)(n-1)} \quad \quad n = 1, \dots, N.

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 は依然多くの科学技術計算で用いられている。

脚注[編集]

[ヘルプ]

関連項目[編集]

外部リンク[編集]