同时对多个维度的多维数组求平均

时间:2016-06-08 17:10:15

标签: arrays matlab

假设我有一个5维数组X,我想一次计算多个维度的元素的平均值(标量),例如:给出前两个指定值的最后三个维度。

我尝试mean(X(1, 1, :, :, :)),但这并没有给我想要的结果,即它产生数组输出而不是标量输出。

我的解决方法是使用循环来计算每个维度的平均值,然后手动计算所有这些部分(边际)均值的均值。但这很麻烦,因为它涉及编写更多代码,这通常会让我感到困惑。

是否有一个简单的技巧可以通过调用类似上面的mean函数来实现这个目标?

2 个答案:

答案 0 :(得分:2)

您需要先reshape数据,以便展平最后三个维度,然后沿第三维度取平均值。

M = mean(reshape(X, size(X, 1), size(X, 2), []), 3);

这里的好处是,这不会在内存中创建X的副本,因为reshape只是改变了访问相同数据的方式。

答案 1 :(得分:2)

这是一种对前两个维度的特定元素进行平均/均值计算的方法 -

% Random input array and specific indices for dimension-1,2
X = randi(9,3,5,4,2,4);
dim12_idx = [1,1; 2,4; 3,1; 3,3]

% Store size parameters
[d1,d2,~] = size(X);

% Reshape input array to 2D merging first two dims as one, merging rest as other 
Xr = reshape(X,d1*d2,[]);

% Calculate the linear index equivalent of the specific indices
lidx = sub2ind([d1,d2],dim12_idx(:,1),dim12_idx(:,2));

% Index into the rows of reshaped array with those and perform mean along
% columns for the final output
out = mean(Xr(lidx,:),2)

原始方法问题

现在,mean(X(1, 1, :, :, :))的方法无法正常工作,因为它只会在一个维度上执行mean计算,我刚发现这是第一个非单例维度(非常有用的信息)意外发现)。为了使它在整个过去的三个维度上工作,您可以将其重新整形为列向量,然后沿第一维使用mean,如下所示 -

mean(reshape(X(1,1,:,:,:),[],1))

让我们使用它来验证下一部分的结果。

使用列出的输入验证

运行示例
>> dim12_idx
dim12_idx =
     1     1
     2     4
     3     1
     3     3
>> mean(reshape(X(1,1,:,:,:),[],1))
ans =
       5.3125
>> mean(reshape(X(2,4,:,:,:),[],1))
ans =
       5.0312
>> mean(reshape(X(3,1,:,:,:),[],1))
ans =
       4.5312
>> mean(reshape(X(3,3,:,:,:),[],1))
ans =
        4.875
>> out
out =
       5.3125
       5.0312
       4.5312
        4.875