2013-05-22 5 views
1

다른 벡터로 집계 할 3 차원 (또는 그 이상) 배열이 있습니다. 특정 응용 프로그램은 공간 데이터를 매일 관측하고 월간 값을 얻기 위해 평균을 구하는 것입니다. 따라서 치수가 <Lat, Lon, Day> 인 배열이 있고 치수가 <Lat, Lon, Month> 인 배열을 만들고 싶습니다.고 차원 배열의 효율적인 집계

다음은 내가 원하는 것의 모의 예입니다. 현재, 내가 루프를 사용하여 올바른 출력을 얻을 수 있지만, 실제로 내 데이터는 매우 큰, 그래서 내가 두 번째 루프보다 더 효율적인 해결책을 기대했다 : 2 개 차원에서

% Make the mock data 
A = [1 2 3; 4 5 6]; 
X = zeros(2, 3, 9); 
for j = 1:9 
    X(:, :, j) = A; 
    A = A + 1; 
end 

% Aggregate the X values in groups of 3 -- This is the part I would like help on 
T = [1 1 1 2 2 2 3 3 3]; 
X_agg = zeros(2, 3, 3); 
for i = 1:3 
    X_agg(:,:,i) = mean(X(:,:,T==i),3); 
end 

, 내가 사용하는 것이 accumarray이지만 더 높은 차원 입력을 허용하지 않습니다.

+0

'for'가 훨씬 더 효율적으로되었습니다. 나는 병목으로 간주하지 않을 것입니다. 그렇게 말하면 아마 추가 코어를 사용하기 위해'parfor '로 바꿀 수 있습니다. – bdecaf

답변

0

먼저 일반적인 방식으로 코드를 다시 작성하여 응답하자에 도착하기 전에 : 당신이 mean 기능을 사용할 수있는 하나의 생각이 reshape에 뭔가를 당신의 X 행렬이다 for 루프를 사용 방지하기 위해

ag = 3; % or agg_size 

X_agg = zeros(size(X)./[1 1 ag]); 

for i = 1:ag 
    X_agg(:,:,i) = mean(X(:,:,(i-1)*ag+1:i*ag), 3); 
end 

에 직접.

splited_X = reshape(X(:), [size(X_agg), ag]); 

는 이제 splited_X(:,:,:,i) 지금 당신이 단지의 3 차원 평균을 찾을 필요가 X(:,:,(i-1)*ag+1:i*ag))

(위와 같이)이다 집계되는 모든 행렬이 들어있는 i 번째 부분 입니다 splited_X :

temp = mean(splited_X, 3); 

그러나이 결과는 4 차원 매트릭스 (3 차원 크기가 1 인 경우)가됩니다. 나는 그것이 얼마나 더 효율적으로 볼을 시도하지 않은

X_agg = reshape(temp, size(X_agg)) 

하지만 for 루프를 사용하지 않기 때문에 그것은 큰 행렬에 더 수행해야합니다 다시 reshape 기능을 사용하여 3D 매트릭스으로 바꿀 수 있습니다.

+1

감사합니다. 간단한 시뮬레이션은이 방법이 내 방법보다 약 2 배 빠르다는 것을 보여줍니다. 나중에 코드에서 다시 변형해야하므로 몇 단계를 결합 할 수 있습니다. –