Matlab 高维数组的高效聚合

Matlab 高维数组的高效聚合,matlab,Matlab,我有一个三维(或更高)数组,我想通过另一个向量来聚合它。具体应用是对空间数据进行每日观测,并对其进行平均,以获得月值。因此,我有一个维度为的数组,我想创建一个维度为的数组 这是我想要的一个模拟例子。目前,我可以使用循环获得正确的输出,但实际上,我的数据非常大,因此我希望找到比第二个循环更有效的解决方案: % Make the mock data A = [1 2 3; 4 5 6]; X = zeros(2, 3, 9); for j = 1:9 X(:, :, j) = A; A =

我有一个三维(或更高)数组,我想通过另一个向量来聚合它。具体应用是对空间数据进行每日观测,并对其进行平均,以获得月值。因此,我有一个维度为
的数组,我想创建一个维度为
的数组

这是我想要的一个模拟例子。目前,我可以使用循环获得正确的输出,但实际上,我的数据非常大,因此我希望找到比第二个循环更有效的解决方案:

% 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,但它不接受更高维的输入。

在得到答案之前,让我们先用更一般的方式重写代码:

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矩阵转换为可以直接使用
mean
函数的值

splited_X = reshape(X(:), [size(X_agg), ag]);
所以现在
splited_X(:,:,:,i)
是第i部分 包含应聚合的所有矩阵,即
X(:,:,(i-1)*ag+1:i*ag))
(如上所述)

现在,您只需要在拆分的X的第三维中找到平均值:

temp = mean(splited_X, 3);
然而,这会产生4D矩阵(其第三维尺寸为1)。您可以使用
重塑
功能再次将其转换为3D矩阵:

X_agg = reshape(temp, size(X_agg))

我还没有尝试过它,看看它的效率有多高,但是对于大型矩阵,它应该做得更好,因为它不使用
for
循环。

for
的效率明显提高。我不会再把它当作瓶颈了。话虽如此,也许你可以用
parfor
替换它来使用你的额外内核。谢谢。简单的模拟表明,这大约是我的方法的两倍。我还需要在以后的代码中进行重塑,以便结合一些步骤。