1

私は300x300のマトリックスを持っています。各「スライス」が元の 300x300 マトリックスである 300x300x1024 マトリックスを作成する必要があります。ループなしでこれを行う方法はありますか? 私は次のことを試しました:

古い=G;

for j=2:N;

    G(:,:,j)=old;

end

ここで、N は 1024 ですが、メモリが不足しています。

より短いルートを知っていますか?

4

3 に答える 3

4

を使用しますrepmat

B = repmat(A,[m n p...]) 

Aのコピーで構成される多次元配列Bを生成します。Bのサイズは[size(A、1)* m、size(A、2)* n、size(A、3)* p、...]です。

あなたの場合、

G=repmat(old,[1 1 1024]);

forループなしで希望の結果が得られます。記憶の問題はまったく別の問題です。300x300x1024のダブルマトリックスは、最大740 MBのメモリを「消費」しますが、最近ではそれほど多くはありません。を試す前にメモリの負荷を確認し、repmatこれらの余分な700MBがない理由を確認してください。を使用memorywhosて、使用可能なメモリとクリアできる変数を確認します。

于 2013-03-14T20:21:00.577 に答える
0

マトリックスを事前に初期化していないため、メモリが不足している可能性があります。

これを最初に行うと、

old = G;
G = zeros(size(old,1), size(old,2), 1024);

1の代わりにからループを開始する2と、おそらくメモリが不足することはありません

これが機能する理由は、最初にマトリックス全体に十分な大きさのメモリブロックを確保するためです。マトリックスを初期化しない場合、matlabは最初に300x300x1マトリックス用に十分なメモリを確保します。次に、2番目のスライスを追加すると、メモリが下に移動し、300x300x2マトリックスに新しいブロックが割り当てられます。以下同様に、最初のマトリックスに割り当てられたメモリにアクセスできなくなります。

これはmatlabで頻繁に発生するため、ループ内で行列を成長させないことが重要です。

于 2013-03-14T20:37:09.580 に答える
-1

簡単な答えはノーです、あなたはループする必要があります。

配列のメモリをブロックコピーするような賢いことをすることができるかもしれませんが、使用する言語さえ私たちに与えませんでした。

おそらく、マトリックス内の各エントリが最小サイズであることを確認する必要があります。バイトマトリックスサイズでも、ほぼギグで話している64ビット値を格納している場合は92MBが必要になります。それがオブジェクトである場合、あなたの番号はすぐに数ギガの範囲に跳ね上がります。ビットパッキングは便利かもしれません...しかし、他の制約が何であるかはわかりません。

編集:タグを更新しました。

私が大いに役立つかどうかはわかりませんが、doubleはそれぞれ64ビットなので、最低限2GBについて話していることになります(32ビットOSを使用している場合は、すでに不可能を超えています)。各セルに異なるメモリ位置への1つまたは2つのポインタが含まれている場合、これは簡単に2倍になる可能性があります(matlabについては、確かにわかりません)。

8GBの64ビットマシンで実行していない場合は、チャンスはないと思います。もしそうなら、あなたができるすべてのメモリをmatlabに割り当てて祈ってください。

申し訳ありませんが、これ以上のお手伝いはできません。誰か他の人がもっとトリックを知っているかもしれません。

于 2013-03-14T19:22:25.653 に答える