我认为您可以采取的几种方法:
% 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));
现在,如果这有点太疯狂了(或者如果显式地使数组 byA(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) 个元素。(这是相当大的内存块。根据您的系统,可能接近 2GB 内存......)
如果你不能把它全部保存在内存中,那么你可能必须决定你要对所有 MSE 做什么,要么分批进行,要么找到一台可以运行完整模拟/代码的机器。
编辑
如果您只想保留所有 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);