【问题标题】:how to find mean on first dimension of 4D array in matlab?如何在matlab中找到4D数组的第一维的平均值?
【发布时间】:2014-11-30 10:19:02
【问题描述】:

我有一个维度为 (122,169,137,16) 的 4D 数组,其中 122 是天,169 和 137 经纬度,16 是年份。 我必须找到每年 122 天的平均值。我试过这样的东西:

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

但它说索引超出矩阵维度。

我是 matlab 的新手。你能建议我简单的方法吗?

【问题讨论】:

  • 检查均值的文档。如果我没记错的话,您可以将维度定义为第二个条目:mean(c,1) Btw。你期望结果是什么?毕竟你有 4 个维度的含义,通过做平均你得到 3d 结果。你想要那个吗?如果是这样,mean(c) 应该可以解决问题,因为它从第一个维度开始。否则您可能需要进一步解释您的问题
  • 你不是说finding mean for each of those 122 days for each year吗?似乎是这样,因为你有 - "t1(i,:,:,j)".
  • 感谢您的回复。我应该生成 16 个矩阵,我猜这将是 1 列矩阵,以便我可以绘制这些矩阵的 pdf。
  • @Vidhi 每个矩阵要多长时间?那是每个矩阵中有多少个元素?

标签: arrays matlab multidimensional-array mean


【解决方案1】:

对于二维矩阵,您可以使用 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 的矩阵。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的回复。我尝试了您的建议,但使用 reshape 命令时出错。
      • @Vidhi 你确定你复制正确了吗?我用这些维度制作了一个随机值的矩阵 t1,并且代码运行良好。你甚至不需要重塑线,因为矩阵 c 已经减少到 [122,1]。但这可能是旧版本的 Matlab 不支持的东西,我使用的是 R2013a。
      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2015-10-31
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多