高维数组的高效聚合

时间:2013-05-22 03:08:33

标签: matlab

我有一个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,但这不接受更高维度的输入。

1 个答案:

答案 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循环。