Matlabの備忘録

Matlabの備忘録

古い情報も混じっているので要注意

コマンドウィンドの消去

clear

は、ワークスペースの消去

clc

はコマンドウィンドの消去。 ちなみに履歴は消去されない。

for文とif文を極力使わない

matlaは行列計算は得意だがfor文の実行速度は遅いみたい。 できるだけ使わないようにする。 例えば以下のようなforとifが混ざったようなコード

for i=1:10
   if i>5
      z(i)=i^2;
   else
      z(i)=i^(-2);
   end
end

これは以下のようにする。

i=1:10;
z=(i>5).*i.^2+(i<=5).*i.^(-2);

これで高速化andコードがすっきり。 ただし、NaNには注意。

行列の抜き出し

A=1:0.1:100;
B=1:10:100;
C=A(B);

とすると、

C=[1 2 3 4 5 6 7 8 9 10]

となる。行列のに抜き出しに便利。

C=A(1:10:100);

でも同じ。

NaNの置換

NaNに限らず特定の値を置換するのに使える。 まず、NaNを検出する。 NaNでなければ配列Aから検出したい数字をaとすると

A==a;

でよい。 NaNの場合は

A==NaN;

とできず

isnan(A);

とする。 あとは、

A(isnan(A))=0;

とすると、配列AのNaNを0に置換する。

グリッドの生成

入力が二次元以上での関数を作成したい場合はグリッドの生成が必要になる。 例えば、入力が二次元で原点からの距離を表現したい場合。

x=-10:10;
y=-10:10;
r=(x.*2+y.*2)^2

としてもだめで、x,yそれぞれy,x軸方向に値が同じな二次元の配列を作らなければならない。

[x y]=meshgrid(-10:10,-10:10);
r=(x.^2+y.^2)^0.5;

となる。ちなみに三次元以上はndgridを使う。

積分をしたい

例としてf(x)=x^2を0から1まで積分します。

f=@(x) x.*2;

と、関数x^2を宣言します。 そして、台形公式(quad)を用いる関数を使う。

int_f=quad(f,0,1);

もしくはシンプソンの公式(quadl)を用いる関数を使う。

int_f=quadl(f,0,1,);

二重積分をしたい場合はdblquad、三重積分をしたい場合はtriplequadを使います。

グラフの目盛り等を調整したい

グラフの表示法の調整に関しては

set(gca)

と入力してみればどんな種類があるか分かる。 例えば。目盛りをTimes New Romanの20 ptにしたければ、

set(gca,'FontSize',20);
set(gca,'FontName','Times New Roman');

とすればよい。 さらに、x,y,z軸の目盛の調整は以下のように行う。 これは、配列が1から始まっているので0に戻している。

set(gca,'XTick',[1 21 41 61 81],'XTickLabel',[0 2 4 6 8])
set(gca,'YTick',[1 21 41 61 81],'YTickLabel',[0 2 4 6 8])
set(gca,'ZTick',[1 51 101],'ZTickLabel',[0 5 10])

waitを入れたい

waitやsleepじゃなくてpauseを使う。

pause(10);

だと10秒wait。

pause

だと、入力待ちの状態になる。

三次元以上の配列は遅い

三次元以上の配列は高速化の処理がされない。 二次元の配列に抑えた方がよい。

実行速度の検証ツール

tic、tocを使うよりもProfileを使った方がよい。 Editorのツール→プロファイラを開くから。 これを使うと、行ごとの実行回数と計算時間が分るのでボトルネックが判明し対処しやすい。

より細かいサンプルで再現したい

データをサンプリング定理を満たしてサンプリングした場合、原理上は元の連続信号が再現できる。 matlabではFFTにより補間(?)というか、より細かいサンプルでデータを再現する関数が存在する。

Y = INTERPFT(X,N) 

で、X のフーリエ変換で補間によって得られる長さ N のベクトル Y を出力する。

ゼロ割やINF、NaNが出たときに計算を止めたい

dbstopをつかう。

dbstop if naninf

で、ゼロ割の際にデバッグモードに移行。

linuxではGUIはいらない

matlab -nojvm

で実行すれば、GUIが起動せず、使用メモリも減る。

imagescで原点を左下にする

デフォルトでは左上になっているので、

set(gca,'YDir','normal');

をimagescの後に入れると原点が左下になる。

最小値 or 最大値のインデックスを得たい

findを使う。Aの最小値のインデックス(min_x,min_y)を得るためには、

[min_x,min_y]=find(A=min(min(A)));

とする。最大値の場合はminをmaxに変える。

二次元配列からの直線or曲線で抜き出し

二次元座標上の値である二次元配列があり、平面上の直線or曲線上の値を抜き出すことを考える。 例として座標グリッドを

[x,y]=meshgrid(min_x:step_x:max_x,min_y:step_y:max_y);

とし、二次元配列をAとするy=-1x+10上の値を抜き出し一次元配列Bを得たいなら

B=A(y==(-1*x+10));

とする。曲線にも使える。

計算終了をメールで教えて欲しい

計算時間がかかる場合は、どこまで進んだかいちいち画面を見るのはめんどくさい。 そこで、計算が終了したらメールを送信で知らせる。

MATLABからメールを送信する初心者によるMATLABメモ

を参考に設定をしsendmailコマンドを使う。 計算に数時間とか数日とかかかる人にはお勧め。

最終更新 May 20, 2020: Update mem_matlab.md (5024344)