2013-11-15 166 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));