如何在 Matlab 中计算多年同一天数据的 3D 矩阵的平均值?
How to calculate averages for a 3D matrix for the same day of data over multiple years in Matlab?
我对在 Matlab 中计算 GPH 异常感兴趣。我有一个包含纬度、经度和数据的 3D 矩阵。其中数据(第 3 个维度)是 32 年(从 1979 年 1 月 1 日到 2011 年 1 月 1 日)以一天为增量间隔的每日 GPH 值。矩阵为 95x38x11689。当矩阵为 3D 时,如何为每一天的数据计算所有年份的日平均值?
换句话说,我如何计算所有年份的 1 月 1 日日期的平均值,以计算 1979-2010 年所有 1 月 1 日的气候平均值(我没有时间信息,但有 GPH每天的价值)?之后的每一天等等。数据还包括闰年。我该如何处理?
示例:对指数 1、365、730 等的所有 1 月 1 日的 GPH 值进行排序并取平均值。之后所有年份的每一天都以相同的方式进行排序。
先把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 的矩阵,其中第 3 维的每个切片是一年中一天的平均值,从 1 月 1 日开始,依此类推
如果您希望包含最后一个 1 月 1 日(2011 年 1 月 1 日),运行 前一个代码之后的这一行:
av_GPH(:,:,1)=mean(cat(3,av_GPH(:,:,1),Last_Jan_1),3);
为了方便知道每个日期对应哪个slice nummer,可以把一年中的所有日期做一个数组:
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);
我对在 Matlab 中计算 GPH 异常感兴趣。我有一个包含纬度、经度和数据的 3D 矩阵。其中数据(第 3 个维度)是 32 年(从 1979 年 1 月 1 日到 2011 年 1 月 1 日)以一天为增量间隔的每日 GPH 值。矩阵为 95x38x11689。当矩阵为 3D 时,如何为每一天的数据计算所有年份的日平均值?
换句话说,我如何计算所有年份的 1 月 1 日日期的平均值,以计算 1979-2010 年所有 1 月 1 日的气候平均值(我没有时间信息,但有 GPH每天的价值)?之后的每一天等等。数据还包括闰年。我该如何处理?
示例:对指数 1、365、730 等的所有 1 月 1 日的 GPH 值进行排序并取平均值。之后所有年份的每一天都以相同的方式进行排序。
先把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 的矩阵,其中第 3 维的每个切片是一年中一天的平均值,从 1 月 1 日开始,依此类推
如果您希望包含最后一个 1 月 1 日(2011 年 1 月 1 日),运行 前一个代码之后的这一行:
av_GPH(:,:,1)=mean(cat(3,av_GPH(:,:,1),Last_Jan_1),3);
为了方便知道每个日期对应哪个slice nummer,可以把一年中的所有日期做一个数组:
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);