我有两个细胞阵列。一个是大小的'trans_blk‘,<232324x1>是由大小<8x8>的细胞组成,另一个'ca’是大小的,<1024x1>是由大小<8x8>的细胞组成的。我想计算'ca‘的每个单元格相对于’trans‘的每个单元的均方误差(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中错误的单元基准操作。
发布于 2015-05-15 16:55:34
我想你可以走几条路:
% 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×1024)元素。(这是一段不错的记忆。根据您的系统,这可能接近2GB的内存.)
如果不能将其全部保存在内存中,那么您可能必须决定如何处理所有MSE,或者分批完成,或者找到一台可以运行完整模拟/代码的机器。
如果您只想保存所有MSEs的和(如下面注释中的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);https://stackoverflow.com/questions/30260107
复制相似问题