我有一个3维(或更高)数组,我想通过另一个向量聚合。具体应用是每日观察空间数据并对其进行平均以获得月度值。所以,我有一个尺寸为<Lat, Lon, Day>
的数组,我想创建一个尺寸为<Lat, Lon, Month>
的数组。
这是我想要的模拟示例。目前,我可以使用循环获得正确的输出,但实际上,我的数据非常大,所以我希望比第二个循环更有效的解决方案:
% Make the mock data
A = [1 2 3; 4 5 6];
X = zeros(2, 3, 9);
for j = 1:9
X(:, :, j) = A;
A = A + 1;
end
% Aggregate the X values in groups of 3 -- This is the part I would like help on
T = [1 1 1 2 2 2 3 3 3];
X_agg = zeros(2, 3, 3);
for i = 1:3
X_agg(:,:,i) = mean(X(:,:,T==i),3);
end
在2维中,我会使用accumarray
,但这不接受更高维度的输入。
答案 0 :(得分:0)
在回答你的答案之前,让我们首先以更一般的方式重写你的代码:
ag = 3; % or agg_size
X_agg = zeros(size(X)./[1 1 ag]);
for i = 1:ag
X_agg(:,:,i) = mean(X(:,:,(i-1)*ag+1:i*ag), 3);
end
为了避免使用for
循环,我们想要将您的X矩阵reshape
改为可以直接使用mean
函数。
splited_X = reshape(X(:), [size(X_agg), ag]);
所以现在splited_X(:,:,:,i)
是第i部分
包含应汇总的所有矩阵X(:,:,(i-1)*ag+1:i*ag))
(如上所述)
现在您只需要在splited_X
的第三维中找到平均值:
temp = mean(splited_X, 3);
然而,这导致4D矩阵(其第三维尺寸为1)。您可以使用reshape
函数再次将其转换为3D矩阵:
X_agg = reshape(temp, size(X_agg))
我没有尝试过它,看它效率有多高,但它对大型矩阵应该做得更好,因为它不使用for
循环。