0

A、B、C、および D は 361x361x120 の倍精度行列です。次の計算を実行しようとすると、メモリ不足エラーが発生します。

Result = (A.*B)+(C.*D);

残念ながら、これらは double でなければならず、残りの計算には次の結果が必要です。加算ステップを分離しようとしましたが、最初の乗算 (A*.B) でスタックします。メモリの問題を回避するために、これらの手順をさらに分割する方法はありますか?

ありがとうございました!

-N.

4

3 に答える 3

0

要素の乗算ごとに要素を実行しているため、ループを使用して操作を簡単に分割できます。以下は、A と B を乗算し、結果を行列 C に保存する方法の例です。

A = rand(361, 361, 120);
B = rand(361, 361, 120);
C = nan(361,361,120);

for i = 1:size(A,1);
  for j = 1:size(A,2);
     C(i,j,:) = A(i,j,:) .* B(i,j,:);
  end
end

ネストされた 2 つのループではなく、1 つのループで動作させることができるはずです。

以下は私のマシンで正常に実行されるため、メモリ不足エラーが発生する理由はわかりません。さらに、乗算は多くのメモリを必要としません。

A = rand(361, 361, 120);
B = rand(361, 361, 120);
C = rand(361, 361, 120);
D = rand(361, 361, 120);

E = (A.*B) + (C.*D); 
于 2012-08-07T18:42:19.570 に答える
0

あなたのコマンドはこれと同等のようです:

 C = nan(361,361,120);
    for i = 1:361;
      for j = 1:361;
         C(i,j,:) = rand(120,1) .* rand(120,1);
      end
    end

このコマンドを除いて、大幅に少ないメモリを使用します

于 2012-08-08T00:02:53.103 に答える
0

何が起こっているかというとA、 、BC、およびD行列のそれぞれに、361*361*120*8バイト (または119MB) の連続したメモリが必要です。を実行するResult = (A.*B)+(C.*D);と、2 つの中間結果と最終結果のそれぞれにも同じ量のメモリが必要になります (ただし、中間結果はその後すぐに解放されます)。ピーク時には、それぞれ 119MB のサイズのメモリの 6 ~ 7 個の連続したブロックのためのスペースが必要になります.. (フラグメンテーションがどの時点で割り当てられた行列の最大可能サイズにどのように影響するかを覚えておいてください)

上記のすべてを保持するのに十分なメモリがない場合は、式を書き直して、既存の変数とclear不要になった変数をできるだけ早く再利用します。

それ以外の場合は、すべてのデータを一度にメモリにロード/保存しないでください。MATLAB の新しいバージョンでは、新しいmatfile関数を使用して MAT ファイルの一部を読み込んだり保存したりできます。for ループを含むブロックで結果を計算します。

その他のアイデア: データに多数のゼロが含まれている場合は、疎行列の使用を検討してください。また、倍精度が本当に必要ですかsingle。代わりに型を使用することで、必要なメモリを半分にすることができます。

もちろん、MATLAB がインストールされている 64 ビット マシンにいつでも移行して、余裕のあるだけの RAM を購入することもできます :)

于 2012-08-07T21:38:12.683 に答える