web-dev-qa-db-ja.com

MATLABの行列の配列

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

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

例:

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

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

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

Roccoが以下に示すように多次元配列を使用してそれを試みましたが、データが非常に大きいため、メモリが不足しているため、別の方法を検討する必要があります。私は他の提案を試みて更新します。

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

39
user57685

すべての行列が同じサイズ(つまり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型)を切り替える必要がある場合があります。ゼロへの呼び出しでこれを行うことができます。

myArray = zeros(500,800,nUnknown,'single');
43
gnovice

セル配列を使用します。これは、すべての行列を格納するために連続したメモリ空間を必要としないという点で、3D配列よりも優れています。実際、各マトリックスはメモリ内の異なるスペースに保存できるため、空きメモリが断片化された場合にメモリ不足エラーを防ぐことができます。セル配列に行列を作成するサンプル関数は次のとおりです。

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
70
Hosam Aly
myArrayOfMatrices = zeros(unknown,500,800);

メモリが不足している場合は、システムでさらにRAMをスローし、64ビットOSを実行していることを確認してください。また、精度を下げてみてください。シングルでうまくいく?):

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

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

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
1
joe

私はいくつかのボリュームレンダリングをオクターブ(matlabクローン)で行い、3Dアレイ(2Dスライスのアレイ)を使用して構築しました

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

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

0
timday