MATLAB

提供: miniwiki
2018/6/14/ (木) 22:44時点におけるja>MathXploreによる版 (参考文献を追加)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先:案内検索

MATLAB(マトラボ)は、アメリカ合衆国MathWorks社が開発している数値解析ソフトウェアであり、その中で使うプログラミング言語の名称でもある。MATLABは、行列計算、関数とデータの可視化、アルゴリズム開発、グラフィカルインターフェイスや、他言語(C/C++/Java/Python)とのインターフェイスの機能を有している。MATLABは、主に、数値計算を扱う事ができるが、追加のオプションSymbolic Math Toolboxを使うことで、数式処理の能力を得ることができる。2004年で、MATLABは産業界、教育界において100万人ユーザーを達成しており、工学、理学、経済学など幅広い業種で利用されている。

概要

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

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

また、iPhoneiPod (iPod touch)、Androidで動作するアプリ「MATLAB Mobile」がある。[1]Webブラウザで動作する「MATLAB Online」も提供されている。

歴史

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

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

日本での展開

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

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

バージョン

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

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

MATLABプロダクトファミリー バージョン
リリース名 MATLAB本体 Simulink, Stateflow
Volume 8 5.0 1996
Volume 9 5.1 1997
R9.1 5.1.1 1997
R10 5.2 1998
R10.1 5.2.1 1998
R11 5.3 1999
R11.1 5.3.1 1999
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
R2012a 7.14 7.9 2012
R2012b 8.0 8.0
R2013a 8.1 8.1 2013
R2013b 8.2 8.2
R2014a 8.3 8.3 2014
R2014b 8.4 8.4
R2015a 8.5 8.5 2015
R2015b 8.6 8.6
R2016a 9.0 8.7 2016
R2016b 9.1 8.8
R2017a 9.2 8.9 2017
R2017b 9.3 9.0

構文

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++などとは違い、コマンドの終わりは改行するだけでよく、セミコロンをつける必要は無い。その代わり、セミコロンをつけると各行からの出力を抑えることが出来る。セミコロンを行末につけなければ、標準出力に実行結果が表示される。実行結果の表示の必要な複数のコマンドを、改行せずに表現する場合はカンマ(',')を使用する。

逆に、一つのコマンドを複数行にまたがって記述する場合は、次の行へ続くことを意味する('...')を行末に付ける必要がある。

オブジェクト指向プログラミング

MATLABは、オブジェクト指向プログラミングをサポートしている。しかし、シンタックスと呼出規約が他言語と大きく異なる。MATLABは、値参照と、参照クラスを用意しています。 メソッドを呼ぶ方法の一例です。

object.method();

object がクラスのインスタンスであれば、object のメンバーを選択することで、メソッドを呼ぶことができます。

classdef hello
    methods
        function greet(this)
            disp('Hello!')
        end
    end
end

hello.m 名のファイルを配置した後、次のコマンドを実行します。

>> x = hello;
>> x.greet();
Hello!

コード例

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自体は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)である。通常、次のように定義される。

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

また、逆変換(IDFT)は、

[math]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[/math].

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

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

[math]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[/math].

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

脚注

  1. MATLAB Mobile” (英語). Mathworks. . 2013閲覧.
  2. MathWorks 製品リリース スケジュール

関連項目

参考文献

  • 大石進一、MATLABによる数値計算、培風館、2001年。

外部リンク


テンプレート:Numerical analysis software テンプレート:Image processing software テンプレート:Linear algebra