ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

パフォーマンスを向上させる方法

配列の事前割り当て

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

  • 文字配列には cell

倍精度ではない行列の事前割り当て

タイプが double 以外の行列を保持するためにメモリのブロックを事前に割り当てる場合、次の方法は避けてください。

A = int8(zeros(100));

このステートメントは、double 値の非スパース行列を作成して int8 の 100 行 100 列の行列を事前に割り当ててから、各要素を int8 配列に変換します。配列を int8 値として作成すると、時間とメモリが節約できます。以下に例を示します。

A = zeros(100, 'int8');

変数の代入

最良のパフォーマンスを得るために、変数に値を代入する際には次のことに注意してください。

  • 異なるデータ型を格納する必要がある場合には、新しい変数を作成する方が有効です。既存の変数のクラスまたは配列の形状を変更すると、処理のために余分な時間をとり、MATLAB の処理速度が遅くなります。

    次のコードは、X に対するタイプを double から char に変更します。これは、パフォーマンスにマイナスの影響を与えます。

    X = 23;
         .
    -- other code  --
         .
    X = 'A';                  % X changed from type double to char
         .
    -- other code  --
  • 既に複素数をもつ変数には実数を代入するべきではありません。逆もまた同様です。既に実数をもつ変数に複素数を代入すると、プログラムのパフォーマンスに影響を与えます。

適当な論理演算子の使用

論理演算子 AND または OR を実行する場合、ショートサーキット演算子を使用するかどうかを選択できます。

演算子

説明

&, |

配列に要素単位で論理演算子 AND および OR を実行する

&&, ||

ショートサーキットを使用して、論理演算子 AND および OR をスカラー値に実行する

if および while ステートメントでは、ショートサーキット演算子 && および || を使用するとより効率的です。これらの演算子は論理式全体を評価しないこともあるためです。たとえば、最初の入力引数が数値でない場合、MATLAB はこの式の最初の部分しか評価しません。

if (isnumeric(varargin{1})) && (ischar(varargin{2}))

&& および || の使用に関する説明は、MATLAB ドキュメンテーションの「ショートサーキット演算子」を参照してください。

パフォーマンス向上に対するその他のヒント

プログラムのパフォーマンスに満足できない場合、次の点も考慮してみてください。

  • 大規模なスクリプト ファイルを小さなファイルに分割する。必要であれば、最初のファイルから 2 番目のファイルを呼び出します。

  • コードの大きな部分から独立の関数 (またはローカル関数と入れ子関数) を作成する。

  • 複雑すぎる関数や式がある場合、より単純なものを使ってサイズを小さくする。簡単な関数は、他の関数と共有できるユーティリティ関数にすることができます。

  • スクリプトの代わりに関数を使用する。一般的に関数の方が速く実行されます。

  • MATLAB の全機能を利用するため、コードをベクトル化する。

  • 大量のメモリを必要としないスパース行列構造を使用して、コードをベクトル化する。

  • MATLAB でプログラムを実行している間は、バックグラウンドで大きなプロセスを実行しないようにする。

  • パフォーマンスにマイナスの影響を及ぼすことがあるので、標準 MATLAB データ クラスのいずれかに、MATLAB 組み込み関数をオーバーロードしないようにする。

詳細

この情報は役に立ちましたか?