はじめてのMatlab

2001年10月02日 見延 庄士郎 

Matlabとは

Matlab は,行列計算およびグラフィックスに優れたソフトウェアで,世界的に理工学系から経済分野まで広く使われている.Matlabはインタープリターであって,ループ演算などはFortran あるいは C というコンパイラーに比べると実行速度は桁違いに遅い.ただし,行列演算などについてはコンパイラ同等の高速な計算ができることと,インタープリターは相対的には遅いとはいえ近年のパーソナルコンピュータでは十分速度が出されるので,大気海洋分野のデータ解析では十分に実用的な計算速度が得られる.統計解析にはS-Plusという有名なソフトウェアがあるが,おそらく大気・海洋業界の統計解析にかぎれば,Matlabの方が広く使われている

Matlabはデータを基本的には行列として扱い,主要な行列演算(四則・逆行列・固有値・特異値分解)を標準でサポートしている{\footnote 多次元配列としてテンソルも定義できるが,テンソルの演算はさほどサポートされていない}.行列計算以外でもFFTなどの基本的な機能を標準で備えており,さらにtoolboxとして多様な拡張機能が提供されている.主要なtoolboxには,スペクトル計算などを持つsignal processing toolbox,各種確率分布関数や主成分分析を行なうstatistical toolbox,地図投影を行なうmapping toolboxがある.このような機能の豊富さと,グラフィックス機能を備えたインタープリターであって開発が容易であるという利点から,多くのプログラムがMatlab用に開発され,その中には一般に公開されているものも多い.筆者の経験からは,まれに大規模データ解析では,コンパイラーの高速な計算速度が必要になる場合もあるけれども,データ解析のほとんどはMatlabを用いる方が作業効率が高い.コンパイラの方が計算速度が速いといっても,実際のデータ解析ではプログラム開発に要する時間の方が計算時間よりもはるかに長く,プログラム開発が効率よく行なえるMatlabが有利である.結局計算時間ではなく,開発時間が勝敗を決める.

さらにプログラムの初心者が利用した場合に,それなりに使えるようになるまでの時間が,matlabの方がfortranよりも短い.開発効率の高さは,教育目的に利用する場合に,特に有意義である.授業や宿題で扱う問題にかけ得る時間は,研究に利用する時間に比べ著しく短く,高い教育効果を上げるためには,短い時間に効率よく課題を消化する環境が必要である.

Matlabの広がり

Matlabの開発元はMathWorks社で,国内の販売代理店はサイバネット社である.2001年7月現在サイバネット社のMatlabのホームページは,

http://www.cybernet.co.jp/products/matlab/

にあって,そこから様々な情報を取得することができる.特に,技術サポート情報の下にある,web courseはMatlab初心者から中級者に有益だろう.やはり技術・サポート情報の下にあるFaqは,自分が管理するコンピュータにインストールする場合にトラブルが生じた場合に,心強い強い味方である.また,教育・研究関係のユーザーが作成しているホームページへのリンクは,多くの有益な情報を含んでいる.また,Matlabは

http://www.cybernet.co.jp/products/matlab/index.html

に示されているように,国内では140を越える大学教育機関で導入され,大規模ライセンス導入校も東北大・京大・阪大・東京工大など30に迫ろうとしている(2001年8月).また上記web siteでは,多くのユーザー事例が紹介されている.

大気海洋業界にもMatlabはもちろん広く用いられている.データ解析については,データ解析についてはdefault standard と言って良いだろう.例えば,Sea-Mat(http://sea-mat.whoi.edu/)では,海洋業界でMatlab scriptを公開している様々web site へのリンクが張られている.これらのスクリプトには,いくつかの主用な数値計算のプログラムの関連script,netcdf access tool, mapping などが含まれている.大気科学や気候変動について,同種のリンクページもあるのかもしれない.あったら見延に教えてね.

Octave

Matlabはやや高価なソフトウェアであり,学生自身が導入するのは難しい.しかしMatlabの機能の多くは,MatlabのクローンであるOctaveというフリーソフトウェアでも実現されている.Matlabを使える環境にない場合は,Octaveを利用することは有力な選択肢である.ただし,OctaveのGraphics機能はgnuplotであるので,Matlabに大きく劣る.例えば,Matlabは3次元空間での等値面・速度ベクトル・流線の表示機能を持つが,多分Octaveではこれらの機能は使えない.さらに,Matlabでは Mapping Toolbox を使うことで,様々な地図投影が可能であるが,Octaveにはその機能はない.またToolboxとして提供されているMatlabの機能のいくつかは,Octaveでも同等の機能が提供されているようであるが,互換性がない場合もあるようだし,カバーされている範囲も少ない.Octaveについては,http://adlib.rsch.tuis.ac.jp/~akira/unix/octave/index-j.htmlにある解説を読むと良いだろう.

なお,今のところ認識しているMatlabの基本的な機能でOctaveでサポートされていない重要な機能は,endを配列の最後の添え字として認識することである.また, subplot(画面分割)はOctaveの ver. 2016以降でサポートされている.他のMatlabとOctaveの相違は上のweb siteにまとめられている.

また,(xsz, ysz)の配列の,コンター図を描くと,Matlabでは横軸がysz縦軸がxszになるが,Octaveでは逆になる.これについてはOctaveの方が,直感と整合的になっている.

MatlabあるいはOctave を使うには

北大・地球惑星ではMatlabの利用にはいくつかの方法がある.まず研究室で購入している場合は,それを使うのが良いだろう.次に,大型計算機センターのアカウントを持っているなら,同センターの上で使うことができる.さらに,地物で学部実験用に購入したMatlab同時使用6ライセンスを使う手もないわけではない.

ただし地物実験用のを使うには,同ライセンスのサーバーは現在aquaの下でprivate address machine で運用されており,これをglobal address のマシンに変えなくてはならない.global addressのマシンについては適宜セキュリティー上のチェックとログ読みなどをする必要があり,これをやる人がいることが条件である.

上のいずれにも該当しなくても,Octaveを使うことでこの授業は十分に参加できる.Octaveのホームページは,http://www.che.wisc.edu/octave/octave.htmlである.また,http://www.ep.sci.hokudai.ac.jp/~minobe/useful_lnk.html にいくつかのOctaveの関連サイトを載せてある.OctaveをVine 2.1 に載せてみたところ,Vine Plus の ftp directory から, gnuplotとoctave のrpmを入手し,まずgnuplotをインストールし,次にoctaveをインストールすれば,問題なくインストールできた.他のディストリビューションでも簡単に入れることができるだろう.

Matlabを知るには

Matlab help

Matlab の関数の利用方法は,Matlabのコマンドラインから, "help 関数名"を実行することで,調べることができる.この関数名は,Matlabの標準関数と当該システムにインストールされているtoolboxに含まれている関数に加えて,ユーザーが付け加えたpath上に置かれているuser作成関数も含まれ,関数の最初のコメントが表示される.Matlab では Help 機能が充実しているために,Matlab の基本的な動作が理解できれば,それ以上についてはHelpによって自習することが相当程度まで可能である.

web上で提供されている基礎練習

簡単なものでは,tomokazuさんが提供している,
http://funada11.denshi.numazu-ct.ac.jp/tomokazu/matlab.html
をざっと眺めるとよいだろう.それが理解できたら,まず,mathworks社が提供しているインフォメーションの中の,ウェブコースの「MATLABクイックスタート」http://www.cybernet.co.jp/products/matlab/information/webcourse/index.htmlを一通り見てみよう.

Matlabをつかいこなすヒント

演算の速度

まずMatlabには,行列演算などのいくつかの特定の演算は専用コードによって高速な演算ができるけれど,それ以外のインタープリターとして実行した場合には計算速度は遅い,という特徴がある.下の計算では,z1の計算は一瞬でできるのに対して,私が使っているPCではz2の計算には21秒かかる.nszを大きくするとこの差はもっと大きくなる.また,z1とz2はほとんど同じだが,相対的に10^-15程度の違いがある.したがって,Matlabの行列演算のコードを使う場合には,そうでない場合と計算機誤差程度の相違が出ることには注意しておかなくてはならない.

% sample 1, 高速な行列演算と低速なループ演算
nsz=100;
x=randn(nsz);
y=randn(nsz);
z1=x*y;

z2=zeros(nsz);
for n=1:nsz
  for m=1:nsz
    for k=1:nsz
      z2(n,m)=z2(n,m)+x(n,k)*y(k,m);
    end
  end
end

loadされるテキストデータファイルは拡張子をextに

loadされるテキストデータファイルの拡張子がextだと,%からコメント行をデータファイルに入れることができて便利.下のEx. 1参照.

Matlabの予約変数

Matlabで変数として(つまり関数ではなく)次の名前が予約されている.
pi(円周率), i,j(虚数単位), inf(無限大), NaN(不定値)
しかし,これらの変数に別な値を代入することができる.また,代入した後に 'clear 変数' を実行することで,Matlab 本来の値で利用することができる.混乱を防ぐために,pi, inf, NaN に他の値を代入することはしない方が良い.ただし,i, j については,Matlab の プログラムでループ変数や行列要素として使うことがあるだろう(これもなるべく避けてx,yなどにする方がいいけれど).したがって,虚数単位の意味で使う前には,必ず 'clear i' を実行するように癖をつけておく方が安全である.

Matlabの関数とかち合わないために

自分が作った関数とMatlabに備えられている関数の名前が,かちあうと当然のことながらどちらかが動かなくなる.これを防ぐにはいくつかのポイントがある.

演習問題

Ex. 1 extデータの読みこみと,plot コマンド.

www.ep.sci.hokudai.ac.jp/~minobe/data_anal/soi_ssn.ext

は次のような南方振動指数の季節ごとデータである.この4季節別プロットを示せ.

% downloaded from http://www.cru.uea.ac.uk/cru/data/soi.htm
% missing value changed as -99.99 from original value, -10.00.
% ANnual values are cut into soi_ann.ext
% Jan-Dec line added for clarity.
%        Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
% missing value flag is  -99.99
% yr     win     spr     sum     aut   soi ssn
1866   -0.37   -0.41   -0.27    0.33
1867   -0.03    0.41    0.10   -0.36
1868   -0.46   -0.87   -1.34   -1.32
...............................
1996    0.03    0.63    0.88    0.24
1997    0.74   -1.68   -2.08   -1.52
1998   -1.87   -1.98    1.12    1.02
1999    1.16    1.11    0.16    0.70
2000    1.03    1.02   -0.24    1.29
2001    0.85   -0.19  -99.99  -99.99

手順:loadコマンドでデータを読み込み,plotコマンドで図示する.適宜 title, legend, xlabel, ylabel, axis コマンドを使おう(Octaveではこれらのコマンドの有無は確認していません).

Ex. 2 hist コマンド

上のデータの特定の季節の頻度分布をhistコマンドで描こう.

Ex. 3 多少の計算

上のデータの冬と,春の相関を計算してみよう.corrcoefという相関関数を計算するコマンドはあるが,これは使わないでおこう.cov, std は使っても良い.なるべく短い行数で書いてみよう.


Ex.1〜3ができたあなたは,もうMatlab使い(初級)だ!