2001年10月02日 見延 庄士郎
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の開発元は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 などが含まれている.大気科学や気候変動について,同種のリンクページもあるのかもしれない.あったら見延に教えてね.
また,(xsz, ysz)の配列の,コンター図を描くと,Matlabでは横軸がysz縦軸がxszになるが,Octaveでは逆になる.これについてはOctaveの方が,直感と整合的になっている.
% 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だと,%からコメント行をデータファイルに入れることができて便利.下のEx. 1参照.
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ではこれらのコマンドの有無は確認していません).
上のデータの特定の季節の頻度分布をhistコマンドで描こう.
上のデータの冬と,春の相関を計算してみよう.corrcoefという相関関数を計算するコマンドはあるが,これは使わないでおこう.cov, std は使っても良い.なるべく短い行数で書いてみよう.
Ex.1〜3ができたあなたは,もうMatlab使い(初級)だ!