|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、R2008b中nc常用命令
0 Q2 _; [" } k) g我以R2008b为例,下载上述地址的nc工具箱加载到路径下(详细的到网上搜,有很多详细的过程),在这里只介绍最常用的命令给新手。
# j+ [) h- t0 n: B5 P1.ncdump filename2 u+ M) o+ t, L0 |' l/ j* B
filename是你的文件名,注意如果不是当前路径请写绝对路径,后缀名要有.nc。
, w; {8 ?' X. f- x, N这个命令是用来查看nc文件的信息。具体的你可以下载个sst的nc文件读读看就知道了。一般我们需要从中了解经度、纬度它们的范围和网格点数,还有时间,最后就是变量。变量一般需要知道它的单位,缺测值(missing value),scale factor。因为这些影响你最后的出图。缺测值需要设置成NaN,Matlab对非数不作处理。乘上scale才是正确的数值,避免出现出图的数值多了10倍或少了10倍的情况。" d9 f$ L6 X6 l6 {, r
2.ncload filename; `, t, t0 T s) a j8 ]
这个命令是用于载入所有变量到workspace中。载入后就可以对数据进行处理和绘图了。这里需要注意的是,通常要对陆地设为NaN,所以要通过ncdump知道缺测值的数,用于改成NaN,Matlab不作处理。还有就是需要你对scale做处理成真实的数值。这里面介绍简便的方法对NaN和scale做处理(如果你没ncdump的话)& o; S% u# ?& H q
载入数据后输入:
! G' t# ~! _* }6 v4 T! Lglobal nctbx_options;
) k8 k: Y* C% u; k$ ~" F' T. r$ pnctbx_options.theAutoNaN = 1;' C6 \& W% Y% L$ ?% t, _7 x: J6 k4 z( d
nctbx_options.theAutoscale = 1;; A8 I, y- \% x
这三行命令就可以很方便的设置NaN和scale了。
. d+ P) z. l* q: {; Y, [具体的在你R2008b中help netcdf可查看所有命令使用方法。8 G" M: k Q: `' i$ |; t" q" u
R2008b常用命令就介绍到这。其它的help~& \4 t3 k& ~& W$ {
( S. O2 I- |2 _. U6 x5 p- J0 b
二、R2012a中nc常用命令
4 [3 D# m' o5 i; J# C高版本的Matlab自带nc工具箱。2012以上的版本肯定都自带了。所以不用再下载工具箱了,直接用它里面的函数。但对于用惯以前nc命令的人来说又要重新学习新的nc命令,所以在这里我把最常用的命令列出来,能解决绝大多数问题。
0 L: H% [" k6 J, I! @1. ncdisp filename(Display contents of NetCDF data source in Command Window)$ s9 d, F1 w/ F/ p& k
如果你就想查看nc文件的信息,想和ncdump一样。在2012a中用ncdisp命令就能查看了。用法和ncdump一样。具体其他用法查看help或者doc ncdisp.$ W9 Y/ Q9 ]( m- r) E& a: ^
2. ncread(Read data from variable in NetCDF data source)
H+ K M" n* msyntax:3 n N3 p- I I
vardata = ncread(source,varname)
% t+ d0 V6 c8 w4 H8 T7 T1 n! Gvardata = ncread(source,varname,start,count,stride)3 q- X. A( U- d3 f% I
直接解释第二条语法:
5 p1 j6 O4 {3 w* Evardata是你自己想设的变量名;source是你的nc文件(字符型);varname是你想载入的变量名(字符型);start是你这个变量想从哪开始,如[1 1]表示二维变量从最开始读;count表示读入变量的数量,如[50 50]表示读入第一维50个数,第二维50个数;stride意思就是步长,默认的是1,但你也可以设置跳着读数据,如[2 2]表示每间隔两个数读数据。6 {% d1 j- \7 ~# [2 j
3 A. r& z5 P X5 v2 D
如何找到我们想要从哪个经纬度读数据呢?我们可以把lon和lat载入到工作空间后结合find函数使用。$ Y5 a* {2 X: X: F0 c
比如:我们想要读取经度是120~290度,纬度是-30~30度的数据。可参考如下程序:
5 h: G, Y) l$ _$ dlon=ncread(...,'lon');+ n3 E- G) g7 u3 ~. j4 {
lat=ncread(...,'lat');
. h' j4 e# Q' ^a=find(lon>=120 & lon<=290);$ L2 m0 k; Y& a0 c% p
b=find(lat>=-30 & lat<=30); % a和b作为经度和纬度的指针 T4 Y: p) M+ H9 ~) x( x" c
lon_num=length(a);
9 N( d4 t6 P/ g+ Ylat_num=length(b);+ I* q: F1 T) M5 U; C( l5 a
sst=ncread(...,'sst',[a(1) b(1) ...],[lon_num lat_num ...]); % 假如是读取SST数据
2 e7 D: h' o% ~9 ~) T4 L3 ~" S8 A8 q% d6 N. L' O! C5 w
基本就介绍完了。
" Z( j9 F" m8 k* F" t. _" r9 _ncread看似比ncload麻烦,但是如果你有大量的数据都在一个nc文件中,直接ncload会把所有的variable都读进来,但是有时我们并不想要所有的变量,而且这样读进来的速度会很慢,大大消耗资源。当然R2008b也有相应函数能实现2012a上面的功能,这就需要我们自己看help了。
) B+ W' m& k- _! @( F, p! `+ K |
|