0

我有两个单元阵列。一个是大小为 <232324x1> 的“trans_blk”由大小为 <8x8> 的单元格组成,另一个是大小为 <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 中的错误单元格引用操作。

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));

现在,如果这有点太疯狂了(或者如果显式地使数组 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);
于 2015-05-15T16:55:34.060 回答