| Programming and Data Types |
MATLABコードの性能の最適化
この節は、MATLABコードの実行速度やメモリの管理を改良する手法を記述します。
MATLABは、行列言語で、ベクトルや行列演算用に設計されています。最も良い性能を得るため、可能な部分で、これらのことを利用してください。
メモリの節約とメモリ使用量の改良の方法については、メモリ使用に関する注意を参照してください。
ループのベクトル化
アルゴリズムをベクトル化することにより、ユーザのM-ファイルをスピードアップすることができます。ベクトル化は、for
やwhileを等価なベクトル、または、行列に変換するものです。
簡単な例題
つぎのコードは、0から10の範囲で1001値の正弦値を計算する一つの方法です。
i = 0;
for t = 0:.01:10
i = i+1;
y(i) = sin(t);
end
t = 0:.01:10; y = sin(t);
2番目の例は、最初のものより実行スピードがアップし、MATLABは、この方法を使います。示されるコードをM-ファイルスクリプトとして作成し、ユーザのシステム上でテストしてください。このとき、コマンドticとtocを使って計算時間を測ってください。
アドバンストな例題
repmatは、ベクトル化を利用した関数の例です。これは、3つの入力引数、すなわち、配列A、行次元M、列次元Nを受け入れます。
repmatは、配列Aの要素を含んだ出力配列を作成します。これは、M行N列の大きさの中にタイルを並べるように配列したものです。
A = [1 2 3; 4 5 6];
B = repmat(A,2,3);
B =
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
repmatは、出力配列の中の要素の位置を作成するためにベクトル化を使っています。
function B = repmat(A,M,N)
if nargin < 2
error('Requires at least 2 inputs.')
elseif nargin == 2
N = M;
end
% Step 1 行と列の大きさを得る
[m,n] = size(A);
% Step 2 1から行/列のサイズまでのインデックスのベクトルを作る
mind = (1:m)';
nind = (1:n)';
% Step 3 上のベクトルからインデックス行列の作成
mind = mind(:,ones(1,M));
nind = nind(:,ones(1,N));
% Step 4 出力配列を作成
B = A(mind,nind);
Step 2は、2列のベクトルを作成します。mindは、1からAの行のサイズまでの整数を含んでいます。nindは、1からAの列サイズまでの整数を含んでいます。
Step 3は、MATLABのベクトルかのトリックを使って、データの1つの列を繰り返し使うことにより、希望する列の行列を作成します。コードは、つぎのようになります。
B = A(:,ones(1,n_cols))
Step 4は、配列のインデックスを使って出力配列を作成します。行のインデックス配列mindの各要素は、以下の手順を使って列のインデックス配列nindの各列と組になります。
mindの最初の要素は、nindの各々の要素を組合せています。MATLABは、列方向にnind行列を移動し、そして、mind(1,1)はnind(1,1)と共に移動し、つぎにnind(2,1)、と移動します。結果は、出力配列の最初の行に入ります。mindにより列方向に移動し、各々の要素は、上のようにnindの要素と共に移動します。nind行列を通して完全に移動したものは、出力配列の1行を満たします。
| シェルエスケープ機能 | 配列を前もって割り当てる |