2014-01-21 37 views
1

我有一個3D矩陣(70x51x8760)(經度x緯度x時間,以小時爲單位),我想要每個24(元素)小時的總和。我的新矩陣都會有這樣的尺寸(70x51x365)。矩陣中每個24個元素的總和

有什麼想法嗎?

回答

2

如果你到達的情況下,第三尺寸不整除24然後就可以做到這一點:

n = 24; 
subs = ceil((1:size(A,3))/n) 

for ii = 1:size(A, 1) 
    for jj = 1:size(A,2) 

     result(ii,jj,:) = accumarray(subs', squeeze(A(ii,jj,:))); 

    end 
end 
5

reshape到4 尺寸,sum到3 RD,和squeeze

B = squeeze(sum(reshape(A, size(A,1),size(A,2),24,[]), 3)); 
+2

或:'重塑(A,尺寸(A,1),大小(A,2 ),[],24)'用於自動判定F中的第三個維度。 – Jonas

+1

也我會用'置換(..,[1 2 4 3])'代替'squeeze'擺脫單尺寸的(IMO是明確的是更好) – Amro

+0

順便說一句它應該是'重塑(A,尺寸( A,1),大小(A,2),24,[])'(和羅迪的版本相同的翻轉) – Amro

4

對於它的價值,這裏是for循環版本:

A = rand(70,51,8760); % sample data 3D matrix 
n = 24;    % group every n-pages and sum across the 3rd dimension 

% calculate starting indices 
sz = size(A); 
ind = 1:n:sz(3); 

% compute the sums in each group of pages 
B = zeros(sz(1),sz(2),numel(ind)); 
for k=1:numel(ind) 
    B(:,:,k) = sum(A(:,:,ind(k):ind(k)+n-1), 3); 
end 

以上假定size(A,3)可以被n整除。當然,如果這不是象以前那樣通過處理第一fix(size(A,3)/n)*n切片,然後做最後用一個迭代的剩餘頁面的情況下,它可能會進行調整。


你可以對@RodyOldenhuis's solution比較上面的代碼:

B2 = permute(sum(reshape(A,sz(1),sz(2),n,[]),3), [1 2 4 3]); 
assert(isequal(B,B2)) 

(在我的測試,這比for循環,但不是快很多)


我也設法充分矢量化@Dan's solution成一個單一的accumarray電話:

[I,J,K] = ndgrid(1:sz(1),1:sz(2),1:sz(3)); 
B3 = accumarray([I(:) J(:) ceil(K(:)./n)], A(:)); 
assert(isequal(B,B3)) 

(警告:這個版本是內存密集型,更不用說比其它解決方案很慢)

相關問題