求两个不同大小的元胞数组的均方误差

to find mean square error of two cell arrays of different sizes

我有两个元胞数组。一个是大小为 <232324x1> 的 'trans_blk',由大小为 <8x8> 的单元格组成,另一个 'ca' 大小为 <1024x1>,由大小为 <8x8> 的单元格组成。 我想计算 'ca' 的每个单元格相对于 'trans_blk'.

的每个单元格的均方误差 (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 中的错误单元格引用操作。

我认为您可以采用的几种方式:

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

我非常喜欢使用 bsxfun 来处理这样的事情,但不幸的是它不能在元胞数组上运行。所以,我借用了here.

答案的单例展开形式
% 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) 个元素。 (这是一个不错的内存块。根据您的系统,这可能接近 2GB 内存...)

如果您不能将所有内容都保存在内存中,那么您可能必须决定要对所有 MSE 做什么,要么分批进行,要么找一台您 可以 运行 完整 simulation/code on.

编辑 如果您只想保留所有 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);