事前割り当て
ループを繰り返すたびにデータ構造のサイズが次第に増大する for
ループと while
ループは、パフォーマンスと使用メモリにマイナスに影響する可能性があります。配列のサイズを繰り返し変更すると、多くの場合、MATLAB® で、より大きなメモリの連続ブロックを探すために余分の時間がかかり、その後、配列を新しいブロックに移動しなければなりません。一般的には、配列に必要なスペースの最大容量を事前に割り当てることで、コードの実行時間を改善できます。
次のコードでは、スカラー変数 x
を作成し、for
ループ内で x
のサイズが徐々に増加するために必要な時間が表示されます。
tic x = 0; for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.301528 seconds.
x
に 1 行 1,000,000 列のブロックのメモリを事前に割り当ててそれをゼロに初期化すると、コードははるかに速く実行されます。これは、増大していくデータ構造体にメモリを繰り返して再割り当てする必要がないからです。
tic x = zeros(1,1000000); for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.011938 seconds.
初期化する配列の種類により、事前割り当てに適切な関数を使用します。
数値配列には
zeros
string 配列には
strings
cell 配列には
cell
table 配列には
table
double 型以外の行列の事前割り当て
タイプが double
以外の行列を保持するためにメモリのブロックを事前に割り当てる場合、次の方法は避けてください。
A = int8(zeros(100));
このステートメントは、double
値の非スパース行列を作成してから各要素を int8
に変換して、int8
の 100 行 100 列の行列を事前に割り当てます。配列を int8
値として作成すると、時間とメモリが節約できます。たとえば、次のような場合があります。
A = zeros(100,'int8');