読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

MATLABのコードを高速化する方法

MATLAB

MATLABプログラミング入門

MATLABプログラミング入門

はじめに

MATLABで作成したコードは遅いことで有名です.

しかし,

MATLAB特有の問題を認識して,

その問題を解決するようなコーディングをすることで,

MATLABのコードは驚くほど高速化します.



今回は下記の記事を元に,

MATLABのコードを高速化する方法を紹介します.

MathWorks 日本 - パフォーマンスを向上させる方法 - MATLAB & Simulink

MathWorks - Techniques for Improving Performance - MATLAB & Simulink


1.配列の事前割当て

ループ毎に配列の大きさを変更するのは,

MATLABのコードでは常套手段ですが,

実は,これはかなりコードの実行速度を低下させます.

もし配列の大きさを事前に決定できるのであれば,

事前に配列を割り当てましょう.

ex)
・悪い例

x = [];
for k = 1:1000
   x = [x k];
end

・良い例

x = zeros(1, 1000);
for k = 1:1000
   x(k) = k;
end

配列の事前割当てに便利な関数

"ones":MathWorks 日本 - すべての要素が 1 の配列の作成 - MATLAB

"zeros"MathWorks 日本 - すべての要素が 0 の配列の作成 - MATLAB

MathWorks 日本 - セル配列を作成 - MATLAB


2.プログラムの複雑性の緩和

MATLABのスクリプトの場合,

if-else文が多くなりすぎると計算コストが大きくなるようです.

なので,そんな時はそれぞれのコードを分割し,

できるだけソフトの複雑性を下げる必要があります.



3.異なる型の変数への代入

実数型の変数に文字列型の値を代入するなど,

ある変数に違う型の変数を代入すると,

MATLABでは計算時間が増大してしまいます.

なので異なる型の変数を使用する時には,

それぞれ別の変数を準備しておきましょう.

ex)
・悪い例

X = 23;
-- other code  --
X = 'A';   

・良い例

X = 23;
-- other code  --
Y = 'A';   

実数と複素数の時も同じです.


4.ループではなく,行列演算を使用する.

よくMATLABのプログラムを高速化する時に,

一番言われるのは"ループを使うな"です.



これはforループやwhileループを使うのではなく,

同じ演算を行列計算で実現しようということです.

ex)
・悪い例

i = 0;
for t = 0:.01:10
    i = i + 1;
    y(i) = sin(t);
end

・良い例

t = 0:.01:10;
y = sin(t);

5.出来るだけMATLABネイティブの関数を使う.

MATLABでデフォルトで対応している関数は,

MATLABのプログラム用に最適化されています.

もし,ある関数を実現する時には,

自分で一から作成するのではなく,

まず初めに,

同じ機能を有するネイティブ関数が存在しないかどうかを探しましょう.


例えば,ファイルの入出力では,

低レベルのI/0ルーチンであるfread,fwriteではなく,

出来るだけ,loadやsave関数を使用しましょう.

loadとsaveのような,ネイティブ関数は

MATLABプログラムにおいて,

より高速に実行でき、

メモリの断片化を抑えられるように作成されています.


6.できるだけ関数化する

Mスクリプトは非常に便利ですが,

計算速度はかなり遅いです.

きちんと速度の出るソフトを作成したい場合は,

それぞれのルーチンをfunctionで関数化し,

できればメインスクリプトもfunctionで関数化してしまいましょう.


7.できるだけバックプロセスを減らす.

当然のことですが,

MATLABで重い処理をするときは,

できるだけ他のソフトを落としましょう.

特にブラウザとかはメモリを食うので

落としておいたほうがいいようです.