求两个不同大小的元胞数组的均方误差
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);
我有两个元胞数组。一个是大小为 <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);