爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 175695|回复: 316

[程序设计] Matlab读取nc文件常用命令总结

  [复制链接]

新浪微博达人勋

发表于 2012-10-7 12:39:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Aires 于 2015-6-18 10:44 编辑

十一假期还是有一些时间,就把读取nc文件最常用的命令列出来。这里只是最常用的,也是最容易的。其他的命令查看Matlab的help。
netcdf工具箱地址:http://mexcdf.sourceforge.net/
一、R2008b中nc常用命令
我以R2008b为例,下载上述地址的nc工具箱加载到路径下(详细的到网上搜,有很多详细的过程),在这里只介绍最常用的命令给新手。
1.ncdump filename
filename是你的文件名,注意如果不是当前路径请写绝对路径,后缀名要有.nc。
这个命令是用来查看nc文件的信息。具体的你可以下载个sst的nc文件读读看就知道了。一般我们需要从中了解经度、纬度它们的范围和网格点数,还有时间,最后就是变量。变量一般需要知道它的单位,缺测值(missing value),scale factor。因为这些影响你最后的出图。缺测值需要设置成NaN,Matlab对非数不作处理。乘上scale才是正确的数值,避免出现出图的数值多了10倍或少了10倍的情况。
2.ncload filename
这个命令是用于载入所有变量到workspace中。载入后就可以对数据进行处理和绘图了。这里需要注意的是,通常要对陆地设为NaN,所以要通过ncdump知道缺测值的数,用于改成NaN,Matlab不作处理。还有就是需要你对scale做处理成真实的数值。这里面介绍简便的方法对NaN和scale做处理(如果你没ncdump的话)
载入数据后输入:
global nctbx_options;
nctbx_options.theAutoNaN = 1;
nctbx_options.theAutoscale = 1;
这三行命令就可以很方便的设置NaN和scale了。
具体的在你R2008b中help netcdf可查看所有命令使用方法。
R2008b常用命令就介绍到这。其它的help~

二、R2012a中nc常用命令
高版本的Matlab自带nc工具箱。2012以上的版本肯定都自带了。所以不用再下载工具箱了,直接用它里面的函数。但对于用惯以前nc命令的人来说又要重新学习新的nc命令,所以在这里我把最常用的命令列出来,能解决绝大多数问题。
1. ncdisp filename(Display contents of NetCDF data source in Command Window)
如果你就想查看nc文件的信息,想和ncdump一样。在2012a中用ncdisp命令就能查看了。用法和ncdump一样。具体其他用法查看help或者doc ncdisp.
2. ncread(Read data from variable in NetCDF data source)
syntax:
vardata = ncread(source,varname)
vardata = ncread(source,varname,start,count,stride)
直接解释第二条语法:
vardata是你自己想设的变量名;source是你的nc文件(字符型);varname是你想载入的变量名(字符型);start是你这个变量想从哪开始,如[1 1]表示二维变量从最开始读;count表示读入变量的数量,如[50 50]表示读入第一维50个数,第二维50个数;stride意思就是步长,默认的是1,但你也可以设置跳着读数据,如[2 2]表示每间隔两个数读数据。

如何找到我们想要从哪个经纬度读数据呢?我们可以把lon和lat载入到工作空间后结合find函数使用。
比如:我们想要读取经度是120~290度,纬度是-30~30度的数据。可参考如下程序:
lon=ncread(...,'lon');
lat=ncread(...,'lat');
a=find(lon>=120 & lon<=290);
b=find(lat>=-30 & lat<=30);    % a和b作为经度和纬度的指针
lon_num=length(a);
lat_num=length(b);
sst=ncread(...,'sst',[a(1) b(1) ...],[lon_num lat_num ...]);  % 假如是读取SST数据

基本就介绍完了。
ncread看似比ncload麻烦,但是如果你有大量的数据都在一个nc文件中,直接ncload会把所有的variable都读进来,但是有时我们并不想要所有的变量,而且这样读进来的速度会很慢,大大消耗资源。当然R2008b也有相应函数能实现2012a上面的功能,这就需要我们自己看help了。

就写这么多,比较啰嗦,给初学者看吧~



评分

参与人数 6金钱 +35 贡献 +2 收起 理由
韩自强 + 1 很给力!
几度★夕阳红?_? + 1 + 1 赞一个!
飚车的蜗牛君 + 10 很给力!
小虫小虫 + 2
hydrology + 1 赞一个!
wlzhongouc + 20 + 1 赞一个!

查看全部评分

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

新浪微博达人勋

发表于 2012-10-23 20:49:41 | 显示全部楼层

ncdisp D:\data.cdf;
lon=ncread('D:\data.cdf',X);这步就出现错误了。貌似说X无定义。我的数据里面有X,Y,elev
我没编过程序,楼主别见笑。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2012-10-23 21:01:13 | 显示全部楼层
大寶貝ル 发表于 2012-10-23 20:49
ncdisp D:\data.cdf;
lon=ncread('D:\data.cdf',X);这步就出现错误了。貌似说X无定义。我的数据里面有 ...

变量X应该有单引号,是字符型,不然它不识别
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2012-10-7 18:26:21 | 显示全部楼层
嗯 还在用2010a
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-7 18:31:07 | 显示全部楼层
wlzhongouc 发表于 2012-10-7 18:26
嗯 还在用2010a

可能习惯用旧版本了吧,不过新的官方功能比较好。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-20 16:54:07 | 显示全部楼层
谢谢楼主,作为一个matlab菜鸟,这正是我想要的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-20 17:22:03 | 显示全部楼层
ningning 发表于 2012-10-20 16:54
谢谢楼主,作为一个matlab菜鸟,这正是我想要的

我也是初学者,呵呵
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-21 14:21:53 | 显示全部楼层
受教了,感谢你讲解
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-21 15:52:43 | 显示全部楼层
atmosbear 发表于 2012-10-21 14:21
受教了,感谢你讲解

能帮助大家就好
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-23 17:02:34 | 显示全部楼层
楼主,我新装的2012a,用你的方法把下载的cdf 用ncdisplay显示出来了,我再用下一步ncread就总出错也改不好
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-23 17:11:44 | 显示全部楼层
大寶貝ル 发表于 2012-10-23 17:02
楼主,我新装的2012a,用你的方法把下载的cdf 用ncdisplay显示出来了,我再用下一步ncread就总出错也改不好

把你程序贴上来看看
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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