|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、R2008b中nc常用命令
4 n2 }4 J1 B1 h$ P6 z我以R2008b为例,下载上述地址的nc工具箱加载到路径下(详细的到网上搜,有很多详细的过程),在这里只介绍最常用的命令给新手。2 I4 z. H+ X, i
1.ncdump filename, m$ T+ J, L* Z4 k
filename是你的文件名,注意如果不是当前路径请写绝对路径,后缀名要有.nc。+ R' K7 c! p2 z6 }3 D0 s
这个命令是用来查看nc文件的信息。具体的你可以下载个sst的nc文件读读看就知道了。一般我们需要从中了解经度、纬度它们的范围和网格点数,还有时间,最后就是变量。变量一般需要知道它的单位,缺测值(missing value),scale factor。因为这些影响你最后的出图。缺测值需要设置成NaN,Matlab对非数不作处理。乘上scale才是正确的数值,避免出现出图的数值多了10倍或少了10倍的情况。
+ r! W+ G9 u+ f! S9 c$ J2.ncload filename
/ _* ]+ b' {& @这个命令是用于载入所有变量到workspace中。载入后就可以对数据进行处理和绘图了。这里需要注意的是,通常要对陆地设为NaN,所以要通过ncdump知道缺测值的数,用于改成NaN,Matlab不作处理。还有就是需要你对scale做处理成真实的数值。这里面介绍简便的方法对NaN和scale做处理(如果你没ncdump的话)7 a7 N0 @* ^+ L+ ^* [6 o( \' H) h
载入数据后输入:
& q9 U& c B5 f! u) l0 ?global nctbx_options;
7 T" a2 w4 m# h% U* Wnctbx_options.theAutoNaN = 1;
7 z" b3 z' r4 s7 I8 X5 ]* i. F- \9 l3 Rnctbx_options.theAutoscale = 1;
& s' Y* ]' v* A1 e1 \$ ~这三行命令就可以很方便的设置NaN和scale了。
: t5 o- o) B6 Z( Z3 X' J$ r具体的在你R2008b中help netcdf可查看所有命令使用方法。' ^; U$ y' w( u1 O/ a( b
R2008b常用命令就介绍到这。其它的help~9 m# v$ K8 h1 Q% z: z5 ]3 j. n
) q$ g& B4 b2 Z, e; @4 X
二、R2012a中nc常用命令, U4 |6 o7 O- q, _* R" e
高版本的Matlab自带nc工具箱。2012以上的版本肯定都自带了。所以不用再下载工具箱了,直接用它里面的函数。但对于用惯以前nc命令的人来说又要重新学习新的nc命令,所以在这里我把最常用的命令列出来,能解决绝大多数问题。( Z$ Z9 @7 Z0 v6 G6 C4 m
1. ncdisp filename(Display contents of NetCDF data source in Command Window)
9 X. `& o, i/ b1 k3 F- p如果你就想查看nc文件的信息,想和ncdump一样。在2012a中用ncdisp命令就能查看了。用法和ncdump一样。具体其他用法查看help或者doc ncdisp.
0 Y, m* ~6 E6 Z$ P2. ncread(Read data from variable in NetCDF data source)
" s4 v$ X; y5 O: v. asyntax:. w& Q$ @6 N% q8 ] b( q
vardata = ncread(source,varname). }+ C$ ^/ J( {: \8 X) j" S
vardata = ncread(source,varname,start,count,stride)
7 H3 S- b+ B2 K+ ~# \- N( {1 C直接解释第二条语法:
3 o- t( M5 J5 r( Wvardata是你自己想设的变量名;source是你的nc文件(字符型);varname是你想载入的变量名(字符型);start是你这个变量想从哪开始,如[1 1]表示二维变量从最开始读;count表示读入变量的数量,如[50 50]表示读入第一维50个数,第二维50个数;stride意思就是步长,默认的是1,但你也可以设置跳着读数据,如[2 2]表示每间隔两个数读数据。4 N5 P8 D5 T* v; l
7 H1 [7 a3 v0 D6 p2 a/ @如何找到我们想要从哪个经纬度读数据呢?我们可以把lon和lat载入到工作空间后结合find函数使用。
$ ^. B7 R' T7 M- ~) o比如:我们想要读取经度是120~290度,纬度是-30~30度的数据。可参考如下程序:$ ?5 A' E% R) `+ ^1 ]
lon=ncread(...,'lon'); l: u6 e7 G3 p- v& q4 v
lat=ncread(...,'lat');0 x5 \; Z6 d0 ^. j6 m9 ^, o
a=find(lon>=120 & lon<=290);1 @5 _; J" L3 g2 F& g
b=find(lat>=-30 & lat<=30); % a和b作为经度和纬度的指针: u& R8 r) g9 S5 ~2 j" a7 b+ m
lon_num=length(a);; w0 F5 q w: k+ `) X9 Z
lat_num=length(b);
( z/ I7 @ G, I8 Hsst=ncread(...,'sst',[a(1) b(1) ...],[lon_num lat_num ...]); % 假如是读取SST数据
" p0 p6 W) j( v6 K7 s/ V) K( ] Y7 S* h, j' p8 K
基本就介绍完了。' u$ s$ j3 ?( L5 K9 H
ncread看似比ncload麻烦,但是如果你有大量的数据都在一个nc文件中,直接ncload会把所有的variable都读进来,但是有时我们并不想要所有的变量,而且这样读进来的速度会很慢,大大消耗资源。当然R2008b也有相应函数能实现2012a上面的功能,这就需要我们自己看help了。
# T/ ]( A2 ^! X3 d( t |
|