Matlab 求两个不同尺寸单元阵列的均方误差

Matlab 求两个不同尺寸单元阵列的均方误差,matlab,block,cell-array,mse,Matlab,Block,Cell Array,Mse,我有两个细胞阵列。一个是“trans_blk”大小由大小的细胞组成,另一个是“ca”大小由大小的细胞组成。 我想计算‘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

我有两个细胞阵列。一个是“trans_blk”大小由大小的细胞组成,另一个是“ca”大小由大小的细胞组成。 我想计算‘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
处理类似的事情,但不幸的是,它不能在单元阵列上运行。所以,我借用了答案的单态展开形式

现在,如果这有点疯狂(或者如果通过
a(idx\u 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
如果内存不足:想想你在分配什么:一个双倍矩阵,即(2324 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);

我认为错误是因为单元格的索引<代码>{:,1}另一个问题是matlab索引以1而不是0开头。您的循环从0:7而不是1:8迭代。当您在控制台中键入
class(trans_blk{1})
时,您能告诉我它说了什么吗?同样对于
class(ca{1})
,我可能会将A替换为
ca
,将B替换为
trans\blk
,尽管我认为用哪种方式做并不重要。也许你们可以测试一下哪个更快?最重要的是,所有的答案都给出了“内存不足”的错误。请告诉我解决我的问题的其他方法。在计算MSE后,您想如何处理它们?是否要将所有MSE相加?你想制作柱状图吗?是的,我必须把它们全部加起来。非常感谢你的帮助和指导。这对我真的很有帮助。
% 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);