如何在Matlab中计算位势高度异常?
How to calculate anomalies of Geopotential Height in Matlab?
我对在 Matlab 中计算 GPH 异常很感兴趣。我有一个纬度、经度和时间的 3D 矩阵。其中时间是 32 年(1979-2010)的每日 GPH 值。矩阵为 95x38x11689。当矩阵为 3D 时,如何计算所有年份中每一天数据的日平均值?
我最终试图根据每日值与给定日期的气候平均值的差异来计算 GPH 异常。
换句话说,我如何计算所有年份的 1 月 1 日日期的平均值,以计算 1979-2010 年所有 1 月 1 日的气候平均值?之后的每一天等等。数据还包括闰年。我该如何处理?
谢谢!
更新:第 3 个维度是 GPH 数据而非时间。它只是从 1979 年到 2011 年的每一天时间步长的数据。
尝试这样的事情:
%Using your dimensions make up some fake data
GPH = rand(95,38,11689)
%Get an index into the 3rd dimension for your desired dates
dateIdx = datenum(1979:2010,1,1)-datenum(1979,1,1) + 1;
%Take the mean along the 3rd dimensions
mean_of_all_Jan_1 = mean(GPH(:,:,dateIdx ),3);
获取另一个任意日期的示例是每年 3 月 15 日。请注意,我只将第一个调用更改为 datenum
而不是第二个
dateIdx = datenum(1979:2010,3,15)-datenum(1979,1,1) + 1;
mean_of_all_March_15 = mean(GPH(:,:,dateIdx ),3);
我假设第 3 维索引 1 是 1979 年 1 月 1 日并且每天以 1 个索引的速度前进。
编辑获取每一天
这将 return 一个 dailyMeanGPH
即 95x38x366
。这样 dailyMeanGPH(:,:,1) 是每个 1 月 1 日的平均值,dailyMeanGPH(:,:,2) = Jan 2nd ...
请注意,2 月 29 日的平均天数会减少,因为它出现的频率是原来的 1/4。
如果 comment/uncomment 可以将输出下方代码中注明的行 return 编辑到元胞数组中,则您可以选择。这样,如果你想要 Jan 1 意味着你会做 dailyMeanGPH{1,1}
然后 Jan 2nd dailyMeanGPH{1,2}
等等。单元格中的索引是 {month,day}
感兴趣的。
function dailyMeanGPH = getDailyMeanGPH(GPH)
daysInMonth = [31 29 31 30 31 30 31 31 30 31 30 31]; %inlcude 29 for Feb
dailyMeanGPH = zeros(size(GPH,1),size(GPH,2),sum(daysInMonth)); %COMMENT OUT IF YOU WNAT OUTPUT IN CELL
% dailyMeanGPH = cell(12,31); %UNCOMMENT IF YOU WANT OUTPUT IN CELL
k = 1;
for m = 1:12
for d = 1:daysInMonth(m)
%Get an index into the 3rd dimension for your desired dates
dateIdx = datenum(1979:2010,m,d)-datenum(1979,1,1) + 1;
if m==2 && d ==29 %Purge Feb 29 from non-leap years.
checkIdx = datenum(1979:2010,3,1)-datenum(1979,1,1) + 1;
dateIdx = setdiff(dateIdx,checkIdx);
end
%Take the mean along the 3rd dimensions.
dailyMeanGPH(:,:,k) = mean(GPH(:,:,dateIdx ),3);%COMMENT OUT IF YOU WNAT OUTPUT IN CELL
k = k+1;
% dailyMeanGPH{m,d} = mean(GPH(:,:,dateIdx ),3);%UNCOMMENT IF YOU WANT OUTPUT IN CELL
end
end
我对在 Matlab 中计算 GPH 异常很感兴趣。我有一个纬度、经度和时间的 3D 矩阵。其中时间是 32 年(1979-2010)的每日 GPH 值。矩阵为 95x38x11689。当矩阵为 3D 时,如何计算所有年份中每一天数据的日平均值?
我最终试图根据每日值与给定日期的气候平均值的差异来计算 GPH 异常。
换句话说,我如何计算所有年份的 1 月 1 日日期的平均值,以计算 1979-2010 年所有 1 月 1 日的气候平均值?之后的每一天等等。数据还包括闰年。我该如何处理?
谢谢!
更新:第 3 个维度是 GPH 数据而非时间。它只是从 1979 年到 2011 年的每一天时间步长的数据。
尝试这样的事情:
%Using your dimensions make up some fake data
GPH = rand(95,38,11689)
%Get an index into the 3rd dimension for your desired dates
dateIdx = datenum(1979:2010,1,1)-datenum(1979,1,1) + 1;
%Take the mean along the 3rd dimensions
mean_of_all_Jan_1 = mean(GPH(:,:,dateIdx ),3);
获取另一个任意日期的示例是每年 3 月 15 日。请注意,我只将第一个调用更改为 datenum
而不是第二个
dateIdx = datenum(1979:2010,3,15)-datenum(1979,1,1) + 1;
mean_of_all_March_15 = mean(GPH(:,:,dateIdx ),3);
我假设第 3 维索引 1 是 1979 年 1 月 1 日并且每天以 1 个索引的速度前进。
编辑获取每一天
这将 return 一个 dailyMeanGPH
即 95x38x366
。这样 dailyMeanGPH(:,:,1) 是每个 1 月 1 日的平均值,dailyMeanGPH(:,:,2) = Jan 2nd ...
请注意,2 月 29 日的平均天数会减少,因为它出现的频率是原来的 1/4。
如果 comment/uncomment 可以将输出下方代码中注明的行 return 编辑到元胞数组中,则您可以选择。这样,如果你想要 Jan 1 意味着你会做 dailyMeanGPH{1,1}
然后 Jan 2nd dailyMeanGPH{1,2}
等等。单元格中的索引是 {month,day}
感兴趣的。
function dailyMeanGPH = getDailyMeanGPH(GPH)
daysInMonth = [31 29 31 30 31 30 31 31 30 31 30 31]; %inlcude 29 for Feb
dailyMeanGPH = zeros(size(GPH,1),size(GPH,2),sum(daysInMonth)); %COMMENT OUT IF YOU WNAT OUTPUT IN CELL
% dailyMeanGPH = cell(12,31); %UNCOMMENT IF YOU WANT OUTPUT IN CELL
k = 1;
for m = 1:12
for d = 1:daysInMonth(m)
%Get an index into the 3rd dimension for your desired dates
dateIdx = datenum(1979:2010,m,d)-datenum(1979,1,1) + 1;
if m==2 && d ==29 %Purge Feb 29 from non-leap years.
checkIdx = datenum(1979:2010,3,1)-datenum(1979,1,1) + 1;
dateIdx = setdiff(dateIdx,checkIdx);
end
%Take the mean along the 3rd dimensions.
dailyMeanGPH(:,:,k) = mean(GPH(:,:,dateIdx ),3);%COMMENT OUT IF YOU WNAT OUTPUT IN CELL
k = k+1;
% dailyMeanGPH{m,d} = mean(GPH(:,:,dateIdx ),3);%UNCOMMENT IF YOU WANT OUTPUT IN CELL
end
end