代码之家  ›  专栏  ›  技术社区  ›  user3052817

如何在Matlab中计算多年内同一天数据的3D矩阵平均值?

  •  -1
  • user3052817  · 技术社区  · 8 年前

    我对在Matlab中计算GPH异常感兴趣。我有一个lat、lon和数据的3D矩阵。其中,数据(三维)是32年(1979年1月1日至2011年1月1日)内以一天增量间隔的每日GPH值。矩阵为95x38x11689。当矩阵为3D时,如何计算所有年份中每天数据的日平均值?

    换句话说,我如何计算所有年份的1月1日的平均值,以计算1979-2010年所有1月1日的气候平均值(我没有时间信息,但每天的GPH值)?之后的每一天都是如此。数据还包括闰年。我该怎么处理?

    示例:对指数1、365、730等的所有1月1日GPH值进行排序和平均,并以相同方式对其后所有年份的每天进行排序和平均。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Adiel    8 年前

    首先,我们去掉2月29日的所有数据,因为这些天都在数据中间,不会出现在每年的数据中,这会影响平均值:

    Feb29=60+365*[1:4:32];
    mean_Feb29=mean(GPH(:,:,Feb29),3);    % A matrix of 95x38 with the mean of all February 29th
    
    GPH(:,:,Feb29)=[];           % omit Feb 29th from the data
    Last_Jan_1=GPH(:,:,end);     % for Jan 1st you have additional data set, of year 2011
    GPH(:,:,end)=[];            % omit Jan 1st 2011
    
    re_GPH=reshape(GPH,95,38,365,[]);
    av_GPH=mean(re_GPH,4);    
    

    re_GPH 是一个95x38x365的矩阵,其中第三维中的每个切片是一年中一天的平均值,从1月1日开始,以此类推。

    如果希望包含最后一个1月1日(2011年1月1日),请在上一个代码后运行此行:

    av_GPH(:,:,1)=mean(cat(3,av_GPH(:,:,1),Last_Jan_1),3);
    

    为了便于了解每个日期对应的切片数字,您可以制作一个包含一年中所有日期的数组:

    t1 = datetime(2011,1,1,'format','MMMMd')
    t2 = datetime(2011,12,31,'format','MMMMd')
    t3=t1:t2;
    

    现在,例如:

    t3(156)=
    
      datetime
    
       June5
    

    所以 av_GPH(:,:,156) 是6月5日的平均值。


    对于您的评论,如果您想从平均值中减去每天:

    sub_GPH=GPH-repmat(av_GPH,1,1,32);
    

    对于2月29日,在从数据中删除它们之前,您需要这样做(上面的第3行):

    sub_GPH_Feb_29=GPH(:,:,Feb29)-repmat(mean_Feb29,1,1,8);