2013-05-22 67 views
1

我有一个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

'for'已经变得非常有效率。我不会再认为它是一个瓶颈。有这样的说法 - 也许你可以用'parfor'替换它来使用你的附加内核。 – bdecaf

回答

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一个想法是reshape你的X矩阵的东西,你可以用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循环。

+1

谢谢。简单的模拟显示这是我的方法的两倍。我也需要稍后在代码中重新塑形,以便可以合并一些步骤。 –