Matlab 矩阵中每24个元素的总和

Matlab 矩阵中每24个元素的总和,matlab,matrix,multidimensional-array,sum,Matlab,Matrix,Multidimensional Array,Sum,我有一个3D矩阵(70x51x8760)(经度x纬度x时间,单位为小时),我想要每个24(元素)小时的总和。我的新矩阵将具有此尺寸(70x51x365) 有什么想法吗?将重塑成第四维度,求和变成第三维度,挤压: B = squeeze( sum(reshape(A, size(A,1),size(A,2),24,[]), 3)); 重塑为第四维度,求和为第三维度,挤压: B = squeeze( sum(reshape(A, size(A,1),size(A,2),24,[]), 3));

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


有什么想法吗?

重塑成第四维度,
求和
变成第三维度,
挤压

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

重塑
为第四维度,
求和
为第三维度,
挤压

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

如果你遇到第三维度不能被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

如果你遇到第三维度不能被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

值得一提的是,以下是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
以上假设
大小(A,3)
可以被
n
平均整除。当然,如果不是这样的话,可以通过像以前一样处理第一个
fix(大小(A,3)/n)*n
切片,然后使用最后一次迭代处理剩余页面来调整


您可以将上述代码与以下代码进行比较:

(在我的测试中,这比for循环快,但相差不大)


我还成功地将矢量化完全整合到一个调用中:


(警告:此版本占用大量内存,更不用说比其他解决方案慢得多)

值得一提的是,以下是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
以上假设
大小(A,3)
可以被
n
平均整除。当然,如果不是这样的话,可以通过像以前一样处理第一个
fix(大小(A,3)/n)*n
切片,然后使用最后一次迭代处理剩余页面来调整


您可以将上述代码与以下代码进行比较:

(在我的测试中,这比for循环快,但相差不大)


我还成功地将矢量化完全整合到一个调用中:


(警告:此版本是内存密集型的,更不用说比其他解决方案慢得多)

或:
重塑(A,size(A,1),size(A,2),[],24)
用于自动确定第三维度。此外,我将使用
置换(…,[1 2 4 3])
而不是
挤压
来摆脱单一维度(我的意思是明确的更好)顺便说一句,它应该是
重塑(A,大小(A,1),大小(A,2),24,[])
(和罗迪版本的翻转相同)或者:
重塑(A,大小(A,1),大小(A,2),[],24)
用于第三维的自动确定。我也会使用
置换(…[1 2 4 3])
而不是
挤压
为了摆脱单一维度(我认为更明确),顺便说一句,它应该是
重塑(A,大小(A,1),大小(A,2),24,[])
(对于Rody的版本也是如此)