Main Content

事前割り当て

ループを繰り返すたびにデータ構造のサイズが次第に増大する 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');

関連する例

詳細