40

多数の可変数の行列をMATLABの配列に格納する方法を探しています。

これを達成する方法はありますか?

例:

for i: 1:unknown
  myArray(i) = zeros(500,800);
end

配列の長さが変化することが不明な場合は、必要に応じて追加情報で修正できます。

更新:パフォーマンスは、私がこれを達成しようとしている主な理由です。以前は、データを単一のマトリックスとして取得し、リアルタイムで表示してから、次のデータセットの処理に進む前にそれを持っていました。

Roccoが以下に提案するように、多次元配列を使用して試しましたが、データが大きすぎてメモリが不足したため、別の方法を検討する必要があるかもしれません。他の提案を試みると更新されます。

更新2:提案をありがとうございましたが、事前に指定しておく必要があります。精度と速度の両方がここで不可欠な要素です。3D配列を試す前に、元の方法に戻って方法を再評価する必要がある場合があります。データをインポートするため。

4

6 に答える 6

72

cell 配列を使用します。これには、すべての行列を格納するために連続したメモリ空間を必要としないという点で、3D 配列よりも利点があります。実際、各行列はメモリ内の異なる領域に格納できるため、空きメモリが断片化されている場合にメモリ不足エラーを回避できます。cell 配列で行列を作成するサンプル関数を次に示します。

function result = createArrays(nArrays, arraySize)
    result = cell(1, nArrays);
    for i = 1 : nArrays
        result{i} = zeros(arraySize);
    end
end

使用するには:

myArray = createArrays(requiredNumberOfArrays, [500 800]);

要素にアクセスするには:

myArray{1}(2,3) = 10;

事前に行列の数がわからない場合は、MATLAB の動的インデックスを使用して、配列を必要なだけ大きくすることができます。パフォーマンスのオーバーヘッドはcell配列のサイズに比例し、行列自体のサイズには影響されません。例えば:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
于 2009-01-21T21:15:25.533 に答える
45

すべての行列が同じサイズ (つまり 500x800) になる場合は、3D 配列を作成できます。

nUnknown;  % The number of unknown arrays
myArray = zeros(500,800,nUnknown);

1 つの配列にアクセスするには、次の構文を使用します。

subMatrix = myArray(:,:,3);  % Gets the third matrix

いくつかの方法で、さらに行列を myArray に追加できます。

myArray = cat(3,myArray,zeros(500,800));
% OR
myArray(:,:,nUnknown+1) = zeros(500,800);

各行列が同じサイズにならない場合は、Hosam が提案したようなセル配列を使用する必要があります。

編集:メモリ不足に関する部分を見逃しました。あなたの nUnknown はかなり大きいと思います。行列のデータ型を切り替える必要がある場合があります (整数を使用している場合は、単一または uintXX 型)。zeros への呼び出しでこれを行うことができます。

myArray = zeros(500,800,nUnknown,'single');
于 2009-01-21T21:57:48.490 に答える
1
myArrayOfMatrices = zeros(unknown,500,800);

メモリが不足している場合は、システムに RAM を追加し、64 ビット OS を実行していることを確認してください。また、精度を下げてみてください (本当に double が必要ですか、それとも single で十分でしょうか?):

myArrayOfMatrices = zeros(unknown,500,800,'single');

その配列に追加するには、次を試してください。

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
于 2009-01-21T21:55:27.917 に答える
0

オクターブ (matlab クローン) でボリューム レンダリングを行い、3D 配列 (つまり、2D スライスの配列) を作成していました。

buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);

メモリ消費は効率的だったようです。(その後の計算速度については同じとは言えません:^)

于 2009-01-21T22:50:52.767 に答える
-2

未知なるものを知っていれば、

あなたは次のようなことができます

myArray = zeros(2,2);
for i: 1:unknown
  myArray(:,i) = zeros(x,y);
end

ただし、最後にmatlabを使用してからしばらく経ちました。したがって、このページは問題に光を当てるかもしれません:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_prog/f1-86528.html

于 2009-01-21T21:17:31.893 に答える
-2

このようにしてください

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end
于 2016-06-28T09:18:43.587 に答える