0

私は2つのセル配列を持っています。1 つはサイズ <232324x1> の 'trans_blk' で、サイズ <8x8> のセルで構成され、別の 'ca' はサイズ <1024x1> で、サイズ <8x8> のセルで構成されます。「trans_blk」のすべてのセルに関して、「ca」の各セルの平均二乗誤差 (MSE) を計算したいと考えています。

次のコードを使用して計算しました。

m=0;
for ii=0:7
    for jj=0:7

        m=m+((trans_blk{:,1}(ii,jj)-ca{:,1}(ii,jj))^2);

    end
end

m=m/(size of cell);    //size of cell=8*8
disp('MSE=',m);

エラーが発生します。MATLAB での不適切なセル参照操作。

4

1 に答える 1

0

あなたが行くことができると私が考えたいくつかの方法:

% First define the MSE function
mse = @(x,y) sum(sum((x-y).^2))./numel(x);

私はbsxfunこのような用途に を使用するのが大好きですが、残念ながらセル配列では動作しません。そこで、ここから答えのシングルトン展開形式を借りました。

% Singleton expansion way:
mask = bsxfun(@or, true(size(A)), true(size(B))');
idx_A = bsxfun(@times, mask, reshape(1:numel(A), size(A)));
idx_B = bsxfun(@times, mask, reshape(1:numel(B), size(B))');

func = @(x,y) cellfun(@(a,b) mse(a,b),x,y);

C = func(A(idx_A), B(idx_B));

さて、それが少しクレイジーすぎる場合 (または明示的に配列を作成するのA(idx_A)が大きすぎる場合) は、以下のようなループ アプローチをいつでも試すことができます。

% Or a quick loop:
results = zeros(length(A),length(B));
y = B{1};
for iter = 1:length(B)
  y = B{iter};
  results(:,iter) = cellfun(@(x) mse(x,y) ,A);  
end

メモリが不足している場合: 割り当てているものを考えてください: (232324 x 1024) 要素である double の行列。(これはかなりのメモリ量です。システムによっては、2GB 近くになる可能性があります...)

すべてをメモリに保持できない場合は、すべての MSE で何をするかを決定し、バッチで実行するか、完全なシミュレーション/コードを実行できるマシンを見つける必要があります。

EDIT すべてのMSEの合計のみを保持したい場合(OPが以下のコメントで述べているように)、次の方法でメモリを節約できます

% Sum it as you go along:
results = zeros(length(A),1);
y = B{1};
for iter = 1:length(B)
  y = B{iter};
  results = results + cellfun(@(x) mse(x,y) ,A);  
end
results =sum (results);
于 2015-05-15T16:55:34.060 に答える