2013-11-15 2 views
0

일관성없는 차원을 가진 고차원 배열을 사용하고 있지만 모두 6+ 차원을 포함하고 있고 마지막 3 개는 XYZ의 3D 공간을 나타냅니다. 각 x, y, z 인덱스에 대해 다른 모든 차원에서 축소되어 해당 인덱스의 평균값을 계산하고자합니다. 나는 현재 벡터를 사용하여 중첩 된 for-loops 내에서 이러한 값을 수집하고 다음 코드 조각 ('베타'는 문제의 다차원 배열)에서와 같이 평균화합니다.Matlab : 다차원 매트릭스 셀을 평균화하는 최적의 방법

먼저 베타 크기

betasdim=size(betas); 

3D 공간의 크기와 축소해야하는 크기의 수를 계산합니다. 다른

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

모든 것은 차원이

이상 붕괴되고 얼마나 많은 차원
otherdims=betasdim(1:length(betasdim)-3); 

이상 축소됩니다 betasdim의 마지막 3 차원 XYZ입니까?

numdims=length(otherdims); 

Ceate 모든 XYZ 이외 치수 이상의 붕괴 콜론의 벡터 :

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

는 초기화 평균 행렬

meanbetas=repmat([NaN],voxdim); 

이제 아마도 비효율적 용 루프 용액 :

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));