Matlabテクニック001

Matlab

http://www.aclab.esys.tsukuba.ac.jp/~ohbuchi/web/index.php?Matlab

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に置換する。


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


実行速度の検証ツール †

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