爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16944|回复: 16

[作图] ncl中计算热浪的频次

[复制链接]
发表于 2018-5-2 21:20:26 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
ncl中我有30年夏天(92天)的日数据,就是每年夏天的温度全球数据,是一个三维数组,time x lat x lon,现在想计算连续三天以上大于35°的记一次,就是第i天大于35°且第第i+1,第i+2都大于35°,直到第i+n天不再大于35°了,记一次事件,想计算每一年各个格点有多少次这样的事件
密码修改失败请联系微信:mofangbao
发表于 2022-3-7 21:04:29 | 显示全部楼层
wsx 发表于 2022-3-7 20:10
ncl有直接确定所有大于35的函数嘛,还是一个一个循环if?

a=[10,40,40,50,40,50,40,45,50,20,25,40,22,20,40,50,40,45,40,50,40,20,12,15];
b=a(:)>=35;                  %得到一个逻辑判断向量,如果大于等于35,为真(1)
ind1=find(diff([0;b])==1);     %大于35的数的起始位置
ind2=find(diff([b;0])==-1);    %大于35的数的结束位置
mask=(ind2-ind1+1>=3);       %长度连续大于等于3个的逻辑数组
ind3=ind1(mask);                 %连续3个大于等于35的数的开始位置
ind4=ind2(mask);                 %连续3个大于等于35的数的结束位置
p=size(ind3,1);            %发生次数
这个是我在气象家园上找的一个基本代码,只需要将a数组改一下,理解下下面的代码意义即可判断
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

发表于 2021-1-26 15:37:07 | 显示全部楼层

回帖奖励 +4 金钱

请问楼主最后问题解决了吗?我也想知道那个循环找到热浪日的代码应该怎么写
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2018-5-3 16:59:21 | 显示全部楼层
stepdance 发表于 2018-5-3 09:10
可能是个笨办法,期待更好更高效的方法

首先,生成一个T(year,day,lat,lon),T中的每个元素都为0

clear all
close all
a=[10,40,40,50,40,50,40,45,50,20,25,40,22,20,40,50,40,45,40,50,40,20,12,15];
b=a(:)>35;                  %b中绝对值大于15的逻辑矩阵

ind1=find(diff([0;b])==1);     %大于35的数的开始位置
ind2=find(diff([b;0])==-1);    %大于35的数的结束位置
mask=(ind2-ind1+1>=6);       %长度大于等于6个的连续
ind3=ind1(mask);                 %连续6个大于35的数的开始位置
ind4=ind2(mask);                 %连续6个大于35的数的结束位置
p=size(ind3,1);                    %发生频次
t=ind4-ind3+1;                      %每次持续的天数

这个是搜到的一个matlab判断热浪频次的代码,不过这是一维的,这种改成多维的不清楚好不好改
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-3 09:10:02 | 显示全部楼层

回帖奖励 +4 金钱

可能是个笨办法,期待更好更高效的方法

首先,生成一个T(year,day,lat,lon),T中的每个元素都为0

然后,T做循环,时空遍历
do
     if 在该年中满足热浪条件
       T(year,day,lat, lon)=1
end do
这样得到的T除了热浪日为1,其余日为0

接着,生成一个heat_wave_frequence(year, lat, lon)

最后,对heat_wave_frequence做循环,时空遍历
do
          tmp=dim_sum_n(T,1)           ;------------ tmp为临时变量,对T的第2维求和,即该年热浪日总和
          heat_wave_frequence(i,j,k)=tmp
          delete(tmp)                         ;------------- 把临时变量删除,养成好习惯   
end do
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-5-3 14:34:29 | 显示全部楼层
谢谢,前一部分判断热浪事件这儿有点不太会,首先我要满足T(i,j,k,l)>35,T(i,j+1,k,l)>35,T(i,j+2,k,l)>35,然后第j+3也要判断是否大于35,一直到不满足这个条件,那我写代码的时候怎么确定这个j+n的是多少呢?而且每一次热浪的持续天数也不一样,不知道怎么灵活的跳出循环。还有一个问题,当我判断j+n<35后,下一次循环要从j+n+1开始判断,而不是下一个j+1开始重新遍历,不知道怎么解决
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2018-5-3 14:35:27 | 显示全部楼层
stepdance 发表于 2018-5-3 09:10
可能是个笨办法,期待更好更高效的方法

首先,生成一个T(year,day,lat,lon),T中的每个元素都为0

谢谢,前一部分判断热浪事件这儿有点不太会,首先我要满足T(i,j,k,l)>35,T(i,j+1,k,l)>35,T(i,j+2,k,l)>35,然后第j+3也要判断是否大于35,一直到不满足这个条件,那我写代码的时候怎么确定这个j+n的是多少呢?而且每一次热浪的持续天数也不一样,不知道怎么灵活的跳出循环。还有一个问题,当我判断j+n<35后,下一次循环要从j+n+1开始判断,而不是下一个j+1开始重新遍历,不知道怎么解决
密码修改失败请联系微信:mofangbao
发表于 2018-5-3 18:45:23 | 显示全部楼层

回帖奖励 +4 金钱

进来学习一下~
密码修改失败请联系微信:mofangbao
发表于 2018-5-5 15:50:32 | 显示全部楼层
18021719881 发表于 2018-5-3 14:35
谢谢,前一部分判断热浪事件这儿有点不太会,首先我要满足T(i,j,k,l)>35,T(i,j+1,k,l)>35,T(i,j+2,k,l)>3 ...

实在不行只能一天一天判断,不过效率太低
密码修改失败请联系微信:mofangbao
发表于 2018-12-14 16:43:48 | 显示全部楼层
请问楼主,问题解决了么
密码修改失败请联系微信:mofangbao
发表于 2019-4-4 13:04:00 | 显示全部楼层

回帖奖励 +4 金钱

您好,请问每次运行到这一行"mask=(ind2-ind1+1>=6);       ",总是出现“错误使用  -
矩阵维度必须一致。”是怎么回事,该如何处理呢?谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表