如何在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 一个 dailyMeanGPH95x38x366。这样 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