非常に大きな 3D マトリックス (: など500000x60x60
) を作成する必要があります。matlabでこれを行う方法はありますか?
やってみると
omega = zeros(500000,60,60,'single');
out-of-memory
エラーが発生します。
sparse 関数は、2D 行列のみを対象としているため、オプションではありません。では、高次元の行列に代わるものはありますか?
非常に大きな 3D マトリックス (: など500000x60x60
) を作成する必要があります。matlabでこれを行う方法はありますか?
やってみると
omega = zeros(500000,60,60,'single');
out-of-memory
エラーが発生します。
sparse 関数は、2D 行列のみを対象としているため、オプションではありません。では、高次元の行列に代わるものはありますか?
Matlab は疎行列 (2D) のみをサポートしています。3D テンソル/配列の場合、回避策を使用する必要があります。次の 2 つが考えられます。
次のようにスパース ベクトルを作成できます。
A = spalloc(500000*60*60, 1, 100);
ここで、最後のエントリ ( 100
) は、最終的に に割り当てられる非ゼロの量を指しA
ます。この量を事前に知っていれば、メモリ使用量がA
より効率的になります。事前にわからない場合は、それに近い数値を使用するだけで機能しますが、A
厳密に必要以上のメモリを最終的に消費する可能性があります。
次に、次のように要素を 3D 配列であるかのように参照できます。
A(sub2ind(size(A), i,j,k))
ここでi
、j
とk
は、それぞれ 1 次元、2 次元、3 次元のインデックスです。
セル配列として 3D テンソル/配列に各 2D ページを作成します。
a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);
へのこの最後のエントリについても同じことが言えspalloc
ます。次に、次のように 3D で連結します。
A = cat(3, a{:});
次に、次のように個々の要素を参照できます。
A{i,j,k}
ここでi
、j
とk
は、それぞれ 1 次元、2 次元、3 次元のインデックスです。
行列が疎なので、ndsparse (N 次元の疎配列 FEX)を使用してみてください。