我有一个3D矩阵(70x51x8760)(经度x纬度x小时数),我想要每24小时(元素)小时的总和。我的新矩阵将具有此维度(70x51x365)。
任何想法?
答案 0 :(得分:5)
reshape
进入4 th 维度,sum
进入3 rd 和squeeze
:
B = squeeze( sum(reshape(A, size(A,1),size(A,2),24,[]), 3));
答案 1 :(得分:4)
对于它的价值,这里是for-loop版本:
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-loop更快,但不是很多)
我还设法将@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))
(警告:这个版本是内存密集型的,更不用说比其他解决方案慢得多)
答案 2 :(得分: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