MATLABのメモリの外 - マトリックス要素でインプレース操作を行うにはどうすればよいですか?
-
28-10-2019 - |
質問
非常に大きなマトリックスをMatlabにロードしています。このマトリックスをロードすると、すでにMatlabがその限界に押し込まれていますが、適合します。
次に、次のことを行い、メモリ外エラーが発生します。
data( :, 2:2:end, :, : ) = - data( :, 2:2:end, :, : );
MATLABはこの操作に新しいマトリックスを割り当てていますか?この操作には余分なメモリが必要ないと思います。 Matlabをより効率的にするにはどうすればよいですか?
ボーナス質問:
'data = permute(data、[1 2 3 4 5 12 8 7 6 9 10 11];'
Matlabはこれを内装することができますか?
解決
いくつかの制約があります(ジョンが引用したローレンのブロックからのものにさらに):
- コードは関数内で実行されている必要があります
- 「データ」に他のエイリアスを持っている必要はありません
「エイリアス」のことは重要であり、正しくなるのが難しい可能性があります。 Matlabはコピーオンワイトを使用します。つまり、関数を呼び出すと、合格する引数はすぐに複製されるのではなく、関数内で変更するとコピーされる可能性があります。たとえば、考慮してください
x = rand(100);
y = myfcn(x);
% with myfcn.m containing:
function out = myfcn(in)
in(1) = 3;
out = in * 2;
end
その場合、変数 x
に渡されます myfcn
. 。 Matlabには価値セマンティクスがあるため、入力引数の変更 in
呼び出しのワークスペースで見てはいけません。だから、の最初の行 myfcn
議論を引き起こします in
になる コピー の x
, 、単にエイリアスではなく。何が起こるかを考えてください try
/catch
-Matlabがエラーを発揮した場合に値を保持できる必要があるため、これはインプレースキラーになる可能性があります。以下では:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
arg = -arg;
end
それから、それ したほうがいい のための最適化を取得します x
の myouterfcn
. 。しかし、以下はできません:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
try
arg = -arg;
catch E
disp( 'Oops.' );
end
end
この情報のいくつかが役立つことを願っています...
他のヒント
MATLABは、操作をサポートしています。これが議論です: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/. 。申し訳ありませんが、これ以上助けになることはできません。
Matlabが実際に何をしているのかを知る良い方法はないと思います。私はあなたをお勧めします:
- 確認してください
clear
操作を試す前に使用されていない変数。 - まだメモリが不足している場合は、簡単なMEXファイルを書き込み、操作を行うために操作を行います。大規模な配列と専門的な要件により、Matlabのアプローチよりも速いでしょう。
同様に、cの.mexファイルとして独自の順列アルゴリズムを作成する必要がある場合は、cの.mexファイルとして記述することができます(つまり、再びメモリが不足しています)。