繁体   English   中英

如何在Matlab中找到4D数组的一维均值?

[英]how to find mean on first dimension of 4D array in matlab?

我有一个尺寸为(122,169,137,16)的4D数组,其中122是天,分别是169和137 lat长,而16是年。 我必须找到每年平均122天。 我尝试过这样的事情:

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

但它说Index超出了矩阵尺寸。

我是Matlab的新手。 您能建议我简单的方法吗?

看来t1是输入4D数组。 您需要使用permute来重新排列输入数组的尺寸,以使第四个尺寸成为新的第二个尺寸。 然后,将其整形为3D数组,以使第3维的每个切片都包含所有要计算平均值的元素。 因此,代码看起来像这样-

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))

我不确定您是在寻找天数的平均值还是其他值的平均值。 假设您要寻找平均时间。 因此,您可以了解一种简单的方法:

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的平均值

您可以使用以下事实:对于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM