矩阵中每24个元素的总和

时间:2014-01-21 15:05:40

标签: matlab matrix multidimensional-array sum

我有一个3D矩阵(70x51x8760)(经度x纬度x小时数),我想要每24小时(元素)小时的总和。我的新矩阵将具有此维度(70x51x365)。

任何想法?

3 个答案:

答案 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