爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10560|回复: 17

[程序设计] matlab读nc数据维数的问题

[复制链接]

新浪微博达人勋

发表于 2014-7-31 12:06:44 | 显示全部楼层 |阅读模式

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

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

x
uwnd=ncread('f:\hgt.mon.mean.nc','hgt',[1 1 1 1],[1 1 8 5],[1 1 1 1]);x=permute(uwnd,[3 4 1 2]);这段语句X是二维的
uwnd=ncread('f:\hgt.mon.mean.nc','hgt',[10 10 1 1],[10 10 8 5],[1 1 1 1]);y=permute(uwnd,[3 4 1 2]);这段语句y是四维的
为什么将第一个变量lon和第二个变量lat的起始值与读入值由1改为10,维数就会发生变化?

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

新浪微博达人勋

发表于 2015-12-15 10:41:23 | 显示全部楼层
来解释下你为什么第一次读的是2维,第二次读的是4维。
ncread的函数的解释是这样用的。
ncread(source,varname,start,count,stride)
source是文件,varname是函数名,重点是后3个。
start指的是起点,是什么意思呢?假设变量本身是一个3维数组【x y z】x=100,y=100,z=100.那么start设置成【1 1 1】,意思就是x,y,z三个方向都是从第1个格点开始读;如果设置成【1 5 10】那么就是x方向从第1个格点读,y方向从第5个格点读,z方向从第10个格点读.这个一般大家都懂。
count的意思是什么呢?并不是终点的意思,count的意思是你要读的总共的格点数。还是那个3维的变量数组,假设从【1 1 1】读起,如果我仅读取平面z=3的x方向5个点,y方向10格点,那么count的设置应该是【5 10 1】,意思是x方向读取了5个点,y方向读取了10个点,z方向只读取1个平面。所以读取出来是个2维数组。这么来看,很明显你的第一个count【1 1 8 5】是二维的,第二个count【10 10 8 5】是四维的,所以你读取出来一个是二维,一个是四维。
最后的stride是步长,如果设置是【1 1 1】,那么你就是三个方向,逐个点读取。如果设置成【2 2 1】意思就是x,y方向是隔一个点读一个,z方向是逐个读取。因此,对于变量数组【100 100 100】,如果起点是【1 1 1】,总数是【5 5 5】,如果不是逐个读取,步长设置不当会超出数组规模的。
再重说一遍,count的意思是读取的格点总数(包含了维数信息),而不是读取的终点值。
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2014-7-31 14:15:46 | 显示全部楼层
用grads1.9 直接SDFOPEN进去就可以了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-7-31 19:21:17 | 显示全部楼层
我不是林海涛 发表于 2014-7-31 14:15
用grads1.9 直接SDFOPEN进去就可以了

额,我用的是matlab,不是grads
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-1 07:06:14 | 显示全部楼层
miqiuqiu123 发表于 2014-7-31 19:21
额,我用的是matlab,不是grads

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

新浪微博达人勋

发表于 2014-8-1 09:05:42 | 显示全部楼层
目测数据应该是是NCEP/NCAR的位势高度数据吧?
此数据MATLAB读取程序
ncid = netcdf.open('F:\indian_ocean\NCEP_NCAR\hgt.mon.mean.nc');
levelid = netcdf.inqVarID(ncid,'level');
latid = netcdf.inqVarID(ncid,'lat');
lonid = netcdf.inqVarID(ncid,'lon');
hgtid = netcdf.inqVarID(ncid,'hgt');
timeid = netcdf.inqVarID(ncid,'time');

level = netcdf.getVar(ncid,levelid);
lat = netcdf.getVar(ncid,latid);
lon = netcdf.getVar(ncid,lonid);
hgt= netcdf.getVar(ncid,hgtid);
time= netcdf.getVar(ncid,timeid);
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-2 10:53:55 | 显示全部楼层
QQT 发表于 2014-8-1 09:05
目测数据应该是是NCEP/NCAR的位势高度数据吧?
此数据MATLAB读取程序
ncid = netcdf.open('F:\indian_oce ...

这个是老版本matlab读nc数据的读法吧,我的读法是新版本的读法,但不知道我说的两种读法读出的X和Y维数不相同
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-2 11:33:47 | 显示全部楼层
新版本的nc读法读到的数据是[Z Y X],但旧版本的nc读法读到的数据是[X Y Z]. 用permute(x,[3,2,1])处理一下就好了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-2 15:52:51 | 显示全部楼层
好东西,共分享。。。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-2 21:05:53 | 显示全部楼层
wkjhwkjh 发表于 2014-8-2 11:33
新版本的nc读法读到的数据是[Z Y X],但旧版本的nc读法读到的数据是[X Y Z]. 用permute(x,[3,2,1])处理一下 ...

permute是交换维数顺序
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-2 21:06:29 | 显示全部楼层
miqiuqiu123 发表于 2014-8-2 21:05
permute是交换维数顺序

但是我的问题是维数个数不一样,用permute好像没法解决
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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