あなたが行くことができると私が考えたいくつかの方法:
% 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);