首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求两个大小不同的单元阵的均方误差

求两个大小不同的单元阵的均方误差
EN

Stack Overflow用户
提问于 2015-05-15 12:55:33
回答 1查看 1.3K关注 0票数 0

我有两个细胞阵列。一个是大小的'trans_blk‘,<232324x1>是由大小<8x8>的细胞组成,另一个'ca’是大小的,<1024x1>是由大小<8x8>的细胞组成的。我想计算'ca‘的每个单元格相对于’trans‘的每个单元的均方误差(MSE)。

我使用了以下代码来计算:

代码语言:javascript
复制
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中错误的单元基准操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 16:55:34

我想你可以走几条路:

代码语言:javascript
复制
% First define the MSE function
mse = @(x,y) sum(sum((x-y).^2))./numel(x);

我非常喜欢在这种情况下使用bsxfun,但不幸的是,它不适用于单元数组。因此,我从here借用了答案的单例展开形式。

代码语言:javascript
复制
% 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)显式地使数组太大),那么您总是可以尝试下面这样的循环方法。

代码语言:javascript
复制
% 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状态),则可以通过以下方式节省内存。

代码语言:javascript
复制
% 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30260107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档