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

时间:2017-11-02 13:07:17

标签: matlab matrix 3d average reshape

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

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

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

1 个答案:

答案 0 :(得分:2)

首先让我们在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日(2011年1月1日),请在上一段代码之后运行此行:

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

为了便于了解哪个切片nubmer对应于每个日期,您可以创建一年中所有日期的数组:

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