如何在matlab中找到4D阵列第一维的均值?

时间:2014-10-06 07:15:31

标签: arrays matlab multidimensional-array mean

我有一个尺寸为4D的阵列(122,169,137,16),其中122是天,169& 137 lat long resp和16是年份。 我必须找到每年122天的平均值。我试过这样的事情:

for i=1:122
     for j=1:16
         c=t1(i,:,:,j)
         d=mean(c(:));
     end 
end 

但是它说Index超过了矩阵维度。

我是matlab的新手。你能建议我这么容易吗?

3 个答案:

答案 0 :(得分:0)

似乎t1是输入4D数组。您需要使用permute重新排列输入数组的维度,以便第四维度成为新的第二维度。然后,将其重新整形为3D阵列,使得第三维中的每个切片保持将要计算其平均值的所有元素。因此,代码看起来像这样 -

mean(reshape(permute(t1,[1 4 2 3]),size(t1,1),size(t1,4),[]),3)

如果您想避免permute表现,第二种方法是 -

[n1,n2,n3,n4] = size(t1);
output = reshape(mean(reshape(t1,[],n2*n3,n4),2),n1,n4)

在第二种方法中,我们不会重新安排尺寸。相反,我们将第二维和第三维合并为第二维,沿第二维获得平均值,最后重塑它以匹配所需结果的大小。

您还可以使用squeeze -

来避免外部重塑
squeeze(mean(reshape(t1,[],n2*n3,n4),2))

答案 1 :(得分:0)

我不确定你是在寻找天的平均值还是其他值的平均值。假设您正在寻找天数的平均值。一个简单的方法,让您了解正在发生的事情,如下:

for i=1:16                    % for each year (instead of 16 you can use size(t1,4))
   c = t1(:,1,1,i);           % extract the days, making c a matrix sized [122,1,1,1]
   cr = reshape(c,[122,1]);   % remove the excess dimensions to make [122,1] (might be unnecessary)
   d(i) = mean(cr);           % compute the mean and store results into d
end

结果d是16个元素的向量,包含每年的平均天数。

关于您的代码:

  • 变量d是标量,但在2个嵌套for循环中使用。这意味着无论计算什么,它都只返回两个循环的最后一次操作的平均值。正确使用它将是d(i,j),因此它存储每个循环的所有平均值。
  • 你正在计算c(:)的平均值,其中c的维数是[1,169,236,1]。这意味着您将矩阵排序为一个矢量,您正在计算lat + long的平均值

答案 2 :(得分:0)

您可以使用以下事实:对于2D矩阵,Xmean(X(:))mean(mean(X,1), 2)相同并使用

d = squeeze(mean(mean(C,2),3));

首先取第二维上的均值,然后取第三维,得到一个大小为122 x 1 x 1 x 16的矩阵。然后squeeze将其转换为大小为122 x 16的矩阵。