假设我有一个5维数组X,我想一次计算多个维度的元素的平均值(标量),例如:给出前两个指定值的最后三个维度。
我尝试mean(X(1, 1, :, :, :))
,但这并没有给我想要的结果,即它产生数组输出而不是标量输出。
我的解决方法是使用循环来计算每个维度的平均值,然后手动计算所有这些部分(边际)均值的均值。但这很麻烦,因为它涉及编写更多代码,这通常会让我感到困惑。
是否有一个简单的技巧可以通过调用类似上面的mean
函数来实现这个目标?
答案 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