爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 113146|回复: 114

[源程序] matlab数据转grads格点数据函数(2016/1/11更新版)

  [复制链接]

新浪微博达人勋

发表于 2013-3-12 09:33:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 斥鷃 于 2018-1-15 18:47 编辑

有关matlab数据转grads格点数据的函数,向大家分享一下,代码不是很复杂,中文注释,不过好处是自动生成和打开CTL文件。之前文件有一些小BUG,在一些版本的MATLAB里会出现维数不匹配的问题。现在重新改进了一下,另外由于新版本grads的特征,特别增加了ctl文件中env这个维数,大家平常不用到就算了,如果用到数据只需再加一维env即可。

附上小A等的帖子,作为很好的内容扩展,:要想细致了解函数具体操作,可以参考该贴:
Matlab处理后的数据写为二进制用于GrADS画图——fwrite函数使用
http://bbs.06climate.com/forum.php?mod=viewthread&tid=20308&fromuid=9098以及站点数据转换的函数@StephenTian
将数据转换为grads站点数据的函数
http://bbs.06climate.com/forum.p ... =45385&fromuid=9098MATLAB读取grads数据的函数
http://bbs.06climate.com/forum.p ... 19&fromuid=9098


以下是函数的help:
  1. >> help gridform
  2. grads格点数据转换函数并生成CTL文件,函数形式:
  3.                  gridform(fid,...)
  4. fid为需要保存的dat数据文件位置(字符串),'...'内填写需要转换的变量,','隔开
  5. 其中变量要求必须为按经度、纬度、层次、时次顺序排列的四维变量,且各维维数信息要求相同

  6. 如果在要求ctl文件名处直接回车,则不生成ctl,生成ctl会要求获取CTL文件中变量名,运行结束后自动打开CTL文件,
  7. CTL文件默认设置了数据文件位置、标题、缺测数信息
  8. 须继续在文件中填写空间维数、时次和修改标题等信息

  9. 函数示例:
  10. gridform('D:\myitem\addtion\mytry\data.dat',uwnd,vwnd);
  11. >>please input the name of CTL file:D:\mytry.ctl
  12. >>input the variablename of NO.1:uwnd
  13. >>input the variablename of NO.2:vwnd

  14. 本例中,函数生成在D:\myitem\addtion\mytry的二进制文件data.dat
  15. 和D盘根目录下的CTL文件,文件中变量为uwnd和vwnd
复制代码




在这里简要说明一下变量必须设置为四维变量的意义:如果我们写入的CTL文件经纬是linear方式编排时,grads需要数据按照经纬度升序(由小到大)排列,即数据只能按照从西到东、从南到北写入二进制文件,所以我们在处理中必须将数据设置成这种形式,这里根据初始数据不同就有很多种方式了。
举个例子,比如我们处理的数据是:

97°E
98°E
99°E
21°N
20
22
21
22°N
25
25
26
23°N
30
31
30


我们的目标是把它变成(从西到东、从南到北):

21°N
22°N
23°N
97°E
20
25
30
98°E
22
25
31
99°E
21
26
30

很明显,用转置的方式就可以了。
如果初始矩阵是

97°E
98°E
99°E
23°N
30
31
30
22°N
25
25
26
21°N
20
22
21

则需要先用flipud(颠倒矩阵)结合转置进行处理得到上述矩阵。

由于matlab的reshape不能给最后几维为1的矩阵补维,所以更新了一下函数以处理这个bug,现在函数可以在使用中自动给最后几维补1处理了。例如直接放入Z为144*73的矩阵,函数会自动将其补维成[144 73 1 1 1]的矩阵。






gridform.m

2.18 KB, 下载次数: 225, 下载积分: 金钱 -5

评分

参与人数 1金钱 +6 贡献 +2 收起 理由
Aires + 6 + 2 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-12 12:38:56 | 显示全部楼层
嗯,这个不错,可以用matlab做计算,用grads画图
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-12 22:20:40 | 显示全部楼层
楼主读取的dat是二进制的数据吗?转出来的格式是什么呢?grads不是可以读取二进制数据吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-13 17:55:44 | 显示全部楼层

这个不是读grads数据的,是写grads能读的数据的,是dat的,另外自带CTL。比如有些数据你在matlab里面处理完了,你可以把matlab工作空间里面的数据转成dat文件,给grads再处理。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-13 18:38:17 | 显示全部楼层
我想学,可是我什么都不懂
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-13 21:49:27 | 显示全部楼层
lpf20092300226 发表于 2013-3-13 18:38
我想学,可是我什么都不懂

有编程基础,懂什么是循环、选择、判断就可以入门了。我当时只学过VB,还是可以自学matlab的,图书馆里面找本有习题的书,把习题都编一遍就好了,软件贵在多用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-13 23:24:34 | 显示全部楼层
斥鷃 发表于 2013-3-13 17:55
这个不是读grads数据的,是写grads能读的数据的,是dat的,另外自带CTL。比如有些数据你在matlab里面处理 ...

哦呵呵相当于输出数据。
请教一下批量按时间输出数据,不知道您是否处理过?
比如按天去输出。一天一个数据。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-14 22:37:38 | 显示全部楼层
是输出成一个grads的dat文件还是多个?没试过,一个应该构造一个新矩阵,第四维把数据按照时间维排列,然后用我这个函数输出就行了。多个dat文件的话试着用循环写,不过具体设置起来够呛,改一改源程序应该可以做到自动生成数据和CTL,但是grads读起来会有些费劲吧……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-15 23:46:12 | 显示全部楼层
kongfeng0824 发表于 2013-3-13 23:24
哦呵呵相当于输出数据。
请教一下批量按时间输出数据,不知道您是否处理过?
比如按天去输出。一天一个 ...

是输出成一个grads的dat文件还是多个?没试过,一个应该构造一个新矩阵,第四维把数据按照时间维排列,然后用我这个函数输出就行了。多个dat文件的话试着用循环写,不过具体设置起来够呛,改一改源程序应该可以做到自动生成数据和CTL,但是grads读起来会有些费劲吧……
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-17 14:36:46 | 显示全部楼层
你这个如果变量不是四维的,只有经度和纬度行不行呢?怎么再扩充成四维的?
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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