MATLAB在大气科学中的应用闵敏中国科学院大气物理研究所中层大气与全球环境探测重点实验室E-mail:mm1218x1x1x1@163.com1序言尽管我的专业是大气物理学与大气环境,但是我对MATLAB这个应用软件充满着浓厚的兴趣。这个软件的学习过程中我遇到了很多困难,不过我也通过研究和向外寻求帮助逐一击破了这些困难。现在市面上MATLAB教程非常的多,但是至今还没有一本完全针对于大气科学专业研究的教程。我不是什么编程高手,更加不是Matlab开发人员,只是希望后来者(主要是从事大气科学相关研究的人)不要向我一样花费大量的时间来学习和研究这个软件。希望这本书能够给大家带来帮助,让大家能把更多的时间投入到自己本专业的研究上去。因为这份教程主要针对从事大气科学研究的专业人士,所以希望参看这份教程的人预先能有一定的MATLAB基础,或是买一本相关基础教程作为辅助。不过我还是会尽我最大的努力将这本教程写的通俗易懂点。这是平生第一次写书,我的水平很有限,难免会出错,希望大家原谅。我一个人的知识面不够宽,非常期望大家提出一些建议。最好能提供一些很有用的资料共大家分享。因为时间有限,我也即将毕业,所以只能像美剧一样一章一章的编写和刊登。最主要的是我想通过动力论坛这个平台和大家相互交流,让这份教程更加满足大气科学研究者的需求。最后,由衷的感谢论坛上各位的宝贵的意见和Matlab-Center网站上提供的各种有用的函数。作者:闵敏中国科学院大气物理研究所2010年3月9日2目录序言第一章MATLAB介绍第二章NetCDF和Grib工具箱的安装2.1安装NetCDF工具箱2.2安装Grib工具箱2.3Linux系统下的相关工具箱第三章卫星数据(hdf格式)的读取与应用3.1卫星数据的读取3.2数据处理的简单技巧和应用3第一章MATLAB介绍首先我还是不厌其烦的介绍下MATLAB。尽管这章只简单的介绍了下MATLAB,但是里面会有很多有用的信息,希望大家还是要仔细看。MATLAB是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。在大气科学中,我们主要利用它强大的计算和函数库来进行数据处理和图形绘制。下面我就介绍几个很有用网站供大家参考:1.国际论坛(很实用,有很多非常好的函数可供下载)3.中国论坛4.的海洋科学研究工具箱5.~rich/map.htmlM-MAP(MATLAB地图绘制压缩包)6.工具箱下载网站7.爱好者论坛(可以注册下,上面提供免费的最新版的MATLAB安装程序下载链接)。8.工具箱下载(这个对从事大气科学研究的人非常重要,建议下载时看清工具箱适用的Matlab版本)4第二章NetCDF和Grib工具箱的安装2.1安装NetCDF工具箱(1)首先在第一章所列出的第八个网站上下载适合你Matlab版本的NC工具箱(在这里我下载的是适用于R2007b的NC工具箱。这点很重要,不然有些NC工具箱的某些功能就会丧失)。(2)然后将解压后的NC工具箱放在Matlab安装根目录下(推荐这样放置),并将工具箱添加到Matlab的Path路径中。第一步:首先是点击左下角的“Start”→“DesktopTools”→“Path”,如图2.1。(或从File工具下拉菜单里面直接进)。图2.1第二步:进入“Path”后点击“AddFolder…”,然后再寻找NetCDF的解压包安放的位置,如图2.2。(注意:为了保证这个工具箱的正常运转,还要同样的将netcdf文件夹下的两个子目录“netcdf”和“snctools”添加到AddwithSubfolders中去。添加的方法和前面的步骤一样)。5图2.2(3)感谢论坛上9楼的意见。因为我主要采用的是R2007b版本,所以没有发现新版Matlab发现里面已经自带了NC工具。如果大家的机器条件允许的话(最好配置要高点,Matlab很耗内存)可以安装R2009及其以后的版本。最新的Matlab已经添加了Netcdf工具箱,主要的命令有netcdf.open(读取NC格式文件)、netcdf.getConstant(获取变量名)、netcdf.close(关闭netcdf文件)等等。2.2安装Grib工具箱(1)网上提供的Grib工具箱下载链接目前不能使用,所以我把以前下载read_grib1.40上传供大家分享。(2)解压后和NC工具箱一样要添加路径。但是Grib是一个用C和Matlab混编的工具箱,所以使用之前要对里面的C语言程序进行编译。第一步:将Matlab最上面的当前路径“currentdirectory”选择到read_grib文件夹下。第二步:在命令框中输入“mexBDS_unpack_mex5.c”进行相关C语言程序的编译。直到屏幕上出现“Selectacompiler:…..”时,再进行编译器的选择(我输入1进行选择)。编译成功后就会出现2.3所显示的图像。6图2.3注意:安装前,自己电脑C盘下的DocumentsandSettings\Administrator\ApplicationData….目录路径名中不要有中文字符。因为Matlab对中文字符的识别能力不是太好,可能会导致安装的失败。(3)安装好后就可以利用read_grib命令读取grib资料。2.3Linux系统下的工具箱以上的这些工具箱都是针对windows操作系统开发的。而大部分气候和气象学研究者都会使用Linux操作系统来进行相关的研究。尽管用NCL软件处理NC和Grib格式文件已经很方便了,但是如果有对Matlab感兴趣的人可以下载matlab-cdi(readNC/Grib联合工具箱)工具箱来读取Linux系统下的NC和Grib格式文件。下载地址:第三章卫星数据(hdf格式)的读取与应用3.1卫星数据的读取(1)很多从事大气遥感、云物理和云气候学研究的人都会使用到hdf格式的卫星数据。读取hdf格式文件主要采用的Matlab自带的hdf工具箱。读取命令的详细信息可以查看help。下面将展示一种简便的读取hdf格式文件的方法。这里采用的实验数据是常用的MODIS气溶胶数据。第一步:点击菜单栏中的file,并选择ImportData项,如图3.1。图3.1图3.28第二步:根据引导直接选择我们所要读取的MODIS气溶胶数据,如图3.2。第三步:选择后就出现图3.3的图像。展开各个选项并选择MODIS的气溶胶产品(“Optical_Depth_Land_And_Ocean”)。双击后就会获取该数据。图3.3图3.49(2)以上的方法非常的简单,但是如果要把读取的命令写到M文件或命令框中方便数据处理,就需要将右下角的一行命令复制,如图3.4中的红框。具体的内容是:Optical_Depth_Land_And_Ocean=hdfread('YourPath\MYD04_L2.A2008122.0255.005.2008123075013.hdf','/mod04/DataFields/Optical_Depth_Land_And_Ocean','Index',{[11],[11],[203135]});3.2数据处理的简单技巧和应用(1)从事大气遥感和气候学研究的人来说,批量处理卫星数据是非常重要的。简单的方法就是将所处理的hdf格式卫星数据放置在一个目录下。然后在命令框中输入“data=dir(’YourPath\*.hdf’)”命令就可将所有的数据导入。最后通过循环控制来读取和处理hdf格式数据。下面给一个批量读取卫星数据的例子Example3.1:data=dir(’YourPath\*.hdf’)X=size(data,1)测数据的数量fori=1:X(文件个数)(文件名,以这样的形式调用)data=hdfread([‘YourPath\’,data(i,1).name],'/mod04/DataFields/Optical_Depth_Land_And_Ocean','Index',{[11],[11],[203135]})…..end(2)如果我们需要大批量处理的卫星数据中的某个变量的维度不统一怎么办?简单的运用前面所讲的方法是不行的。这时首先要用hdfinfo命令读取hdf某个变量的维度,然后再读取该数据中我们所需要的变量。具体的步骤如下(和上面一样以MODIS气溶胶产品的光学厚度变量为例子):第一步:首先导入要读取的数据。然后再读它的信息。info=hdfinfo('YourPath\MYD04_L2.A2008122.0255.005.2008123075013.hdf')第二步:在Matlab左边的Workspace中双击info变量,然后就可以看见图103.5所显示的图像。在这里我们所需要的变量是Vgroup,所以双击它(这是一个结构体变量意思就是多层数据)。然后进入图3.6所显示的界面。图3.5图3.6第三步:依次类推,一层一层的往下找,直至找到我们所需的光学厚度变量。在这时,我们可以看见如图3.7的结果。其中下面一个红框所找到的变量名非常重要,因为这是自动控制实现的基础。而上面的那个红框中的变量名Dims就是我们所要找的Optical_Depth_Land_And_Ocean指数额结构信息变量(行列)。我们所需要的就是这个行列信息。Example3.2:info=hdfinfo('YourPath\MYD04_L2.A2008122.0255.005.2008123075013.hdf');hang=info.Vgroup.Vgroup(1,2).SDS(1,8).Dims(1,1).Size;lie=info.Vgroup.Vgroup(1,2).SDS(1,8).Dims(1,2).Size11图3.7−150−100−50050100150−80−60−40−20020406080图3.8显示hang=203lie=12135第四步:这样就可以获取Optical_Depth_Land_And_Ocean准确的行列。然后将Example3.1中的第二条命令改为data=hdfread([‘YourPath\’,data(i,1).name],'/mod04/DataFields/Optical_Depth_Land_And_Ocean','Index',{[11],[11],[hanglie]})(3)根据上面所讲的方法给大家做个画图的例子。画的是MODIS月平均的全球气溶胶光学厚度(1×1°分辨率)。详细的例子看Example_3_1_AOD.m,如图3.813