7

非常に大きな 3D マトリックス (: など500000x60x60) を作成する必要があります。matlabでこれを行う方法はありますか?

やってみると

omega = zeros(500000,60,60,'single');

out-of-memoryエラーが発生します。

sparse 関数は、2D 行列のみを対象としているため、オプションではありません。では、高次元の行列に代わるものはありますか?

4

2 に答える 2

8

Matlab は疎行列 (2D) のみをサポートしています。3D テンソル/配列の場合、回避策を使用する必要があります。次の 2 つが考えられます。

  1. 線形割出し
  2. セル配列

リニアインデックス

次のようにスパース ベクトルを作成できます。

A = spalloc(500000*60*60, 1, 100); 

ここで、最後のエントリ ( 100) は、最終的に に割り当てられる非ゼロの量を指しAます。この量を事前に知っていれば、メモリ使用量がAより効率的になります。事前にわからない場合は、それに近い数値を使用するだけで機能しますが、A厳密に必要以上のメモリを最終的に消費する可能性があります。

次に、次のように要素を 3D 配列であるかのように参照できます。

A(sub2ind(size(A), i,j,k)) 

ここでijkは、それぞれ 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}

ここでijkは、それぞれ 1 次元、2 次元、3 次元のインデックスです。

于 2012-09-28T17:56:04.470 に答える
6

行列が疎なので、ndsparse (N 次元の疎配列 FEX)を使用してみてください。

于 2012-09-28T17:15:00.047 に答える