我有一個3D矩陣(70x51x8760)(經度x緯度x時間,以小時爲單位),我想要每個24(元素)小時的總和。我的新矩陣都會有這樣的尺寸(70x51x365)。矩陣中每個24個元素的總和
有什麼想法嗎?
我有一個3D矩陣(70x51x8760)(經度x緯度x時間,以小時爲單位),我想要每個24(元素)小時的總和。我的新矩陣都會有這樣的尺寸(70x51x365)。矩陣中每個24個元素的總和
有什麼想法嗎?
如果你到達的情況下,第三尺寸不整除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
reshape
到4 第尺寸,sum
到3 RD,和squeeze
:
B = squeeze(sum(reshape(A, size(A,1),size(A,2),24,[]), 3));
對於它的價值,這裏是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))
(警告:這個版本是內存密集型,更不用說比其它解決方案很慢)
或:'重塑(A,尺寸(A,1),大小(A,2 ),[],24)'用於自動判定F中的第三個維度。 – Jonas
也我會用'置換(..,[1 2 4 3])'代替'squeeze'擺脫單尺寸的(IMO是明確的是更好) – Amro
順便說一句它應該是'重塑(A,尺寸( A,1),大小(A,2),24,[])'(和羅迪的版本相同的翻轉) – Amro