MATLABについて.
注意点,過去に困ったことやその解決法などをメモ
せっかくためた経験値をムダにしないために.
MATLAB
MATLABとは,行列を扱うのが得意なプログラミング言語.FORTRANとの一番大きな違いは,行列を扱うとき,FOTRTANでは行列の要素を扱わなくてはならないが,MATLABでは行列そのものを扱える.すなわち行列のまま足し引きしたり逆行列をとったり,一部分を抽出したりできるということ.
グラフィックも得意で,3次元の動画も簡単に作ったり保存したりできる.
プログラムは,
①コマンドウィンドウに逐次入力する
②-Mファイル(***.m)を作って,コマンドウィンドウ上でMファイル名を入力
の2通りで実行できる.
使い方に関しては,
マニュアル参照
できることがたくさんある分,コマンドは非常に多いので適宜マニュアルで関数の使い方を調べながら使うといいと思う.
Mファイルについて
Mファイルには,「スクリプトMファイル」,「ファンクションMファイル」の2種類がある.
スクリプトMファイル: 一連のコマンド,関数を一括処理できる.
ファンクションMファイル: 入出力引数を伴うユーザー定義の関数を作成できる.
◇ファンクションMファイルの決まり
例:test_fun.m というファンクションMファイルを作る.
入力変数:a,b,c
出力変数:A,B
**********************************************
↓ test_fun.m
**********************************************
1行目 function[A,B] = test_fun(a,b,c)
出力引数 関数名 入力引数
2行目 A = ****(a,b,c); B = ****(a,b,c)
**********************************************
実行@workspace
**********************************************
/a = ****;
/b = ****;
/c = ****;
/[A,B] = test_fun(a,b,c);
/
ワークスペースにはtest_funによって計算された出力値A,Bだけが入る.
変数a,b,cやMファイル内の変数はローカル変数として扱われる.
ファンクションMファイルの利点.
ファイルについて
MATLABで扱うファイルには大きく分けて2種類ある.
MATLAB固有のバイナリ形式のファイル(つまり人間の言葉じゃないファイル).
特長は,MATLABで生成されるすべてのデータタイプに対応していて,実数以外にも複素数や文字データ等異なるタイプの変数も同時に扱える.
ファイルも小さくなるので,MATLAB環境下で大きいデータを扱う際非常に有効.
save MAT-ファイルへの保存
load MAT-ファイルの読み込み
数字とかアルファベットとかで書いてあるファイル.
バイナリファイルに比べサイズが大きくなるが,容易に編集できる.
読み書きのコマンド
save ASCIIオプションでASCIIファイルに保存
load ASCIIオプションでASCIIファイルをロード
csvwrite カンマ区切りでASCIIファイルに書き出し
dlmwrite 指定した区切り文字でASCIIファイルに書き出し
textread 書式を指定してASCIIファイルを読み込み
xlsread Excelスプレッドシートファイルの読み込み
imread グラフィックスファイルからイメージの読み込み
aviread ムービー(AVI) ファイルの読み込み
etc.
パス
普通,カレントディレクトリにないプログラムは実行できず,エラーが出る.
いちいちフォルダを移動してプログラムを実行するのは面倒な事も多い.
→「パス設定」によって,ディレクトリを変更することなくプログラムの実行ができる.
MATLABで・・・
「ファイル」→「パス設定」→「フォルダを追加」
目的のプログラムがあるフォルダを追加する.これを「サーチパスに追加する」とい
う.
MATLABのプログラム実行の優先順位は,
etc......
- カレントディレクトリ内のファイル
- サーチパス上のファイル
となっている.サーチパスに追加することで,あたかも組み込み関数のようにプログラムを実行することができる.
※同名のプログラムが複数ある場合
サーチパスやカレントディレクトリの中に,同名複数のプログラムがあるとき,
カレントディレクトリが最優先され,次に最も最近追加されたパスのプログラムが優先される.
このような場合,あらかじめパスを通しておくのではなく,プログラム実行の直前にパスを通し,直後にパスを削除する方が便利だったりする.
そのためのコマンド↓
追加:addpath('ディレクトリ名')
削除:rmpath('ディレクトリ名')
基本的な関数
fopen
ファイルを開く fid = fopen(...)
fscanf
データを読む A = fscanf(fid,....)
save
変数を.matファイルに保存 save **(ファイル名)** a b
load
matファイルから変数を読み込む
plot
surf
surf(Z) は,[m,n] = size(Z)のとき,x = 1:nとy = 1:mを使って行列Zのz成分から3次元シェーディングサーフェスを作成します.
要するに関数z(x,y)の関数面を3次元でプロットします.
surfc(...) は,Surfaceオブジェクトの下部にコンタープロットを描画します.
contour
contour(Z) は,行列 Z のコンタープロット(等高線)を描画します.
contour(Z,n) は,n レベルのコンターをもつ行列 Z のコンタープロットを描画します.
contourf
塗りつぶした2次元コンタープロット
quiver
quiverプロットは、点(X,Y)で成分(U,V)をもつ矢印として,速度ベクトルをプロットします.
quiver(U,V,U,V)
要するに1回微分のベクトルを描く
get(gcf) 図のプロパティ一覧
get(gca) 軸のプロパティ一覧
=>変更したい変数(例:FontSize)を set(gca,'FontSize',14) のようなコマンドによって変更
diff
gradient
fzero('fun,x')
F(x)=G(x)という方程式を解きたいとき
関数fun=F(x)-G(x)を用意
fzeroを使うとfun=0となるxの値を返す
NETCDFについて
matlab上で特殊なデータ形式’.nc’を扱うためのプログラム?
MATLAB2008a以前では,mexcdfとsnctoolsをインストールする必要があったが,
2008bからはオフィシャルでnetcdfがサポートされたため,snctoolsをインストールしてパスを通すだけで使えるようになった.
ダウンロード
パス設定by森先生
snctoolsのフォルダを適当な場所に置いて(ここではaddpath 'C:/Program Files/MATLAB/matlab_public/'に),MATLAB上で addpath 'C:/Program Files/MATLAB/matlab_public/snctools' と入力すると,「パスが通る」
1. nc_varget - reads a netcdf variable
2. nc_varput - writes to a netcdf variable
3. nc_attget - reads a netcdf attribute
4. nc_attput - writes a netcdf attribute
5. nc_padheader - pads header section of large netCDF files
6. nc_dump - prints netcdf metadata
注意点
- MATLAB上では,大文字と小文字は別のものとして扱われるので注意.
(fortranでは区別ない)
グラフは,'g','c'.....のような形で色を指定できるが,8色しか用意されてない.
任意の色を指定するには,以下のようにする.
plot(X,Y,'Color',[1.000 0.502 0.000],'LineStyle',':')
色の指定は3次元配列で行う.プロパティエディタなどで好みの色の値を見つけましょう.
主な色として,
紫-[ 0.502 0.000 0.502 ]
ピンク- [0.753 0.753 0.753]
オレンジ- [1.000 0.502 0.000]
覚書
便利なコマンド
- 「whos」と入力すると,現在定義されている変数の名前,サイズ,バイト数,クラスが表示される.
- 「help ****」(****は任意の関数)と入力すると,その関数のヘルプが見られる.
- 「lookfor ****」(****は任意の語句)と入力すると,ヘルプ上で語句を検索した結果該当した関数を表示してくれる.
- squeeze(A)
要素数が1である次元に関して羅列した行列をつくる.
AがA(2,1,3)であれば,2行3列の行列になる.
A(t,x,y),t=50,x=100,y=100という配列があって,A(3,:,:)の絵を描きたいとする.
このとき,surf(A(3,:,:))とするとエラーが出る.
B=squeeze(A(3,:,:))としてから,surf(B)とすると良い.
計算の高速化その1・事前割り当て
MATLABの計算速度を上げるために・・・
forループを使うとベクトル化した計算よりも計算時間がかかる.
forループや whileループでは,既存の行列の大きさを徐々に増やしていく.しかしこれを行うと,MATLABは増加する行列により多くのメモリを割り当て,連続したブロックに割り当てられなくなった場合にメモリ内でデータを移動する作業も行うことになる.結果プログラムの速度は大幅に下がる.
これを避けるため,最終的な大きさの行列を保持するのに十分なメモリーブロックを事前に割り当てておくといい.例えば,
A=zeros(10000, 10000) % 10000×10000の行列を事前割り当て
- フォルダ内にあるファイル名のリストを取得し,変数に保持する方法
出力引数を付けてdir関数を実行することでファイルに関する情報を出力できる.
ファイル名は,「構造体」の「nameフィールド」保持されている.
例えば,C:\MATLAB71\work にある拡張子が.m であるファイルのファイル名を順に表示したい場合は,
D=dir('C:\MATLAB71\work\*.m');
for k=1:length(D)
disp(D(k).name)
end
ヘッダがあるテキストファイルを読み込みたい
- fgetl(fid) で1行読みとばし.
- textread で読み込む場合,書式で'headerlines'オプション指定すれば可能.
dat = textread('fname','%10c','headerlines',2);
2行のヘッダを読んだ後,幅10の文字を変数datに読み込む
テキストファイルに行ごとに配列を書き込みたい
テキストファイルに出力するとき,改行が思うとおりにいかないことがある.
→
よくあるエラー
配列の次元の不一致のため演算不可能なとき.
たとえば,A(2,3)という2行3列の行列があったとする.
これを新しい行列Bのn番目に代入したい時,
B(n) = A
とするとこのエラーが出る.
Bは1次元の配列だから2次元のAは代入できない.
B(n,:,:) = A
とすれば代入できる.
複数の行にまたがってコマンドを書きたい
次の行にもコマンドが続く場合,前の行の最後に3つ以上のピリオド(...)をつける.
注意
最終更新:2010年01月30日 15:14