爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 32794|回复: 64

[程序设计] Matlab处理后的数据写为二进制用于GrADS画图——fwrite函数使用

  [复制链接]

新浪微博达人勋

发表于 2014-1-29 13:16:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Aires 于 2018-3-23 03:12 编辑

很长时间没干正事,没发过帖子了。最近是想把适于简单处理数据的Matlab软件和绘图精致的GrADS软件结合起来用。所以就涉及到如何把Matlab处理后的数据写为GrADS识别的二进制格式绘图问题。在这里,给大家介绍写二进制数据的Matlab函数——fwrite
这样,以后大家如果觉得Matlab画图繁琐,想用GrADS画图,就可以这样用啦~

废话不多说,上正题~~~

第一步:处理数据,变成GrADS直接绘图的数据。

举例来说,如一个空间SST数据,矩阵大小为21*81,把它变为Matlab中contour或contourf直接绘图的矩阵形式。这时候要注意,GrADS二进制数据存放顺序为:经度、纬度、层、变量、时间。所以在用fwrite写为二进制数据时,一定要按GrADS默认格式存放顺序去写!
以SST数据来说,是经度和纬度,按直接contour画图的话,SST正好是数据矩阵,行是不同经度数据,列是不同纬度数据。这里,大家要先知道fwrite函数是如何把Matlab数据写入二进制文件的。下面简单介绍fwrite函数用法,具体help fwrite或者doc fwrite查看帮助。

我们这里以最简单经纬SST数据为例:
采用这种格式:count = fwrite(fid, A, precision)
fid是文件指针,用fwrite之前,需要用fopen打开一个新文件,如:fid=fopen('文件路径','w');
A是要写入的数据矩阵,注意:Matlab写入是按列写入的,也就是说如果A是一个二维矩阵,那么fwrite的写入方式是先是第一列,然后是第二列,依此类推。。。

就Matlab处理后的SST数据而言,如果按照contour画图的矩阵直接用fwrite是不对的,大家可以自己理解一下。按照经度、纬度的顺序(GrADS默认存放格式),首先需要将SST数据flipud,然后转置。即:sst=flipud(sst); sst=sst'; 这样处理后的矩阵直接用fwrite就是GrADS默认存放顺序了。

另外,precision是设置写入二进制数据的格式,具体大家查fread函数,里面有介绍。注意:默认的是uint8,我们将precision改成float32。

第二步:打开二进制文件,用fwrite写入数据

举例:
fid=fopen('filename','w');
count=fwrite(fid,sst,'float32')  % 注意sst是用flipud和转置后的数据矩阵
fclose(fid)

这样就写好了二进制数据啦,接下来常规的写好ctl文件,就可以用GrADS画图了。
其他复杂的写入大家自己变通一下就好了~

@斥鷃发过gridform函数的帖子也可以自动实验上述的功能,链接如下:
http://bbs.06climate.com/forum.p ... 11&fromuid=9098




评分

参与人数 1金钱 +20 贡献 +2 体力 +100 收起 理由
传说中的谁 + 20 + 2 + 100 淡定

查看全部评分

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

新浪微博达人勋

发表于 2014-1-29 14:42:42 | 显示全部楼层
太感谢了 好赞一个!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-1-29 14:46:48 | 显示全部楼层
楼主好像碉堡了据说matlab的数学计算功能很强大
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-1-29 15:11:09 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-1-30 12:20:25 | 显示全部楼层
你说的应该是我的帖子:
matlab数据转grads格点数据函数
http://bbs.06climate.com/forum.p ... 11&fromuid=9098
我自己试了一下,我自己处理的数据简单转置一下就可以contour了,不需要flipud,所以像你说的可能给出如何处理矩阵具体的操作还有会些问题。在用contour处理的时候我一般都用meshgrid生成网格以后再画,用这种方式画的图形是依据定位meshgrid的网格确定的,这样数据具体在矩阵中的位置就不影响了。我估计你的数据纬度分布是从高纬到低纬的网格,我处理的是从低纬到高纬的网格,这个大概是我们处理方式不一样的原因吧,有关grads纬度读数这个事情我应该还是要在帖子里面讲讲才是~我再改改吧~谢啦~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-1-30 13:42:41 | 显示全部楼层
斥鷃 发表于 2014-1-30 12:20
你说的应该是我的帖子:
matlab数据转grads格点数据函数
http://bbs.06climate.com/forum.php?mod=viewth ...

谢啦~一直没找到这个帖子,算是提供两种grads处理数据的方法吧。把你的网址我也放到帖子里面去,大家都可以找得到。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-1-30 14:40:06 | 显示全部楼层
Aires 发表于 2014-1-30 13:42
谢啦~一直没找到这个帖子,算是提供两种grads处理数据的方法吧。把你的网址我也放到帖子里面去,大家都可 ...

你这个比较细一些,当时发的时候只管上程序了,还是解释细些好,互相提出问题才能互相进步,呵呵
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-1-30 15:17:38 | 显示全部楼层
斥鷃 发表于 2014-1-30 14:40
你这个比较细一些,当时发的时候只管上程序了,还是解释细些好,互相提出问题才能互相进步,呵呵{:eb509: ...

没有啦,因为一开始用你那个gridform出问题了,所以我才自己写二进制的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-2-3 11:36:44 | 显示全部楼层
学习学习了,马年大吉
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-2-3 18:03:16 | 显示全部楼层
kongfeng0824 发表于 2014-2-3 11:36
学习学习了,马年大吉

新年快乐!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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