Matlab 矩阵中每24个元素的总和
我有一个3D矩阵(70x51x8760)(经度x纬度x时间,单位为小时),我想要每个24(元素)小时的总和。我的新矩阵将具有此尺寸(70x51x365)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));
有什么想法吗?
将
重塑成第四维度,求和
变成第三维度,挤压
:
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的版本也是如此)