2013-11-15 134 views
0

我正在处理尺寸不一致的高维数组,但都包含6维以上,最后3个代表XYZ中的三维空间。对于每个x,y,z索引,我希望计算该索引的平均值,并折叠到所有其他维度上。我正在使用矢量来在嵌套的for循环中收集这些值,并对它们进行平均,如下面的一组代码片段('betas'是所讨论的多维数组):Matlab:平均多维矩阵单元的最优方法

首先,获取测试版的维数

betasdim=size(betas); 

计算三维空间的大小以及我需要折叠的维数。 betasdim的最后3个维度是XYZ:

voxdim=betasdim(length(betasdim)-2:length(betasdim)); 

其他的一切都是尺寸崩溃了

otherdims=betasdim(1:length(betasdim)-3); 

多少维度被崩溃了?

numdims=length(otherdims); 

Ceate坍塌在比XYZ其他所有维度冒号的矢量:

dimwildcard=repmat({':'}, 1, numdims); 

初始化均值矩阵

meanbetas=repmat([NaN],voxdim); 

而现在可能低效for循环溶液:

for x=1:voxdim(1) 
for y=1:voxdim(2) 
    for z=1:voxdim(3) 
     voxbetas=betas(dimwildcard{:},x,y,z);%get all beta values for this xyz 
     voxbetas=reshape(voxbetas,1, numel(voxbetas));%reshape to vector 
     meanbetas(x,y,z)=nanmean(voxbetas); %average the vector and store in new array 
    end 
    end 
end 

记住,我需要从每个索引的nanmean()获取单个值,除了遍历每个x,y,z的值之外是否有更快的解决方案?

回答

2

如果我理解正确,你想要的是squeeze(mean(mean...(mean(betas))...))。你可以做到这样说:

betas = randn(2,3,4,5,6,7); %// example data 
meanbetas = betas; %// intialization 
for n = 1:ndims(betas)-3 
    meanbetas = mean(meanbetas); %// average along first non-singleton dimension 
end 
meanbetas = squeeze(meanbetas); %// remove singleton dimensions 

或者,您可以重塑,这样除了最后三个塌陷成一个单一的(第一)的尺寸,并沿着第一维度平均只有一次,所有的尺寸:

betas = randn(2,3,4,5,6,7); %// example data 
N = ndims(betas); %// number of dimensions 
meanbetas = squeeze(mean(reshape(betas, ... 
    [], size(betas,N-2), size(betas,N-1), size(betas,N)), 1));