各类应用示例
字符串处理
当前路径下包含文件名以'fnl_20110705'开头的4个文件:
fnl_20110705_00_00_c
fnl_20110705_06_00_c
fnl_20110705_12_00_c
fnl_20110705_18_00_c
fn=dir('fnl_20110705*');
则fn.name中保存了每个文件名字符串
将前两个文件名与第三个文件名前8个字符连接起来:
fns=[fn(1:2).name, fn(3).name(1:8)];
fns=strcat(fn(1:2).name, fn(3).name(1:8)); %与上一行结果相同
垂直方向连接成一个字符矩阵:
fns=char({fn(1:2).name,fn(3).name(1:8)});
fns=strvcat(fn(1:2).name,fn(3).name(1:8));
函数cellfun的使用技巧:
fns={fn.name}:(为包含四个文件名字符串的cell数组)
读出这些文件名中包含的时间信息,保存为数值矩阵:
方法一:
tim=zeros(numel(fns),4)
for i=1:numel(fns)
tim(i,:)=sscanf(fns{i}, 'fnl_%4d%2d%2d_%2d');
end
方法二:
tim=cellfun(@(x)sscanf(x, 'fnl_%4d%2d%2d_%2d')',fns,'UniformOutput',false);
tim=cell2mat(tim);
regexp的使用:
将文件名中的小时数读出来:
tim=regexp(fns,‘\d*(?=_00_c)','match')
%tim=regexp(fns,'[0-9]*(?=_00_c)','match')
tim=[tim{:}];
tim = (cell类型)
'00' '06' '12' '18’
将文件名中的’00_c’替换为’30’:
fns2=regexprep(fns,'\d*_c','30')
日期和时间函数
计算1950年1月到2012年12月每月1号相对于1950年1月1日的天数,并将日期转换为英文日期形式:
yr=repmat([1950:2012],[12 1]);
mon=repmat([1:12]', [1 size(yr,2)]);
dy=ones(size(yr));
mydate=[yr(:) mon(:) dy(:)];
daten=datenum(mydate)-datenum([1950 1 1]);
sdate=datestr(datenum(mydate));
% sdate=datestr([mydate zeros(mydate)]); %与上行结果相同
sdate2=datestr(datenum(mydate), 'mmm dd, yyyy');
如果要使用无闰年的相应计算方法,则可使用MetToolbox中的相应函数:
datenum365, datevec365
各类气象数据文件的读写
NetCDF文件
NetCDF文件的读写方法较多,可以直接利用Matlab的内置函数ncread, ncwrite, nccreate等high-level函数来实现,也可利用netcdf.open, netcdf.inqVar, netcdf.getVar等low-level函数来完成。利用high-level相关函数来读写nc文件的例子代码:
nctest_inner.m
利用MetToolbox中的NetCDF Toolboxc对netcdf文件进行各种操作,更具特色,往往实现起来更为便捷。利用其读取变量的方法:
nc=netcdf(‘data.nc’);
var=nc{‘var’}(:);
close(nc);
读取并创建NETCDF4压缩文件的方法,具体代码见:
GRIB1/2
利用MetToolbox中的nctoolbox-1.1.1对grib文件中的变量进行读取:
fn='xxx.grib2';
vname='var';
ds=ncgeodataset(fn);
vv=ds.geovariable(vname);
att=cell2struct(vv.attributes(:,2),vv.attributes(:,1),1);
tim=vv.gettimedata();
disp(datestr(tim,'yyyy-mm-dd HH:MM:SS'))
lon=vv.getlondata();
lat=vv.getlatdata();
zz=double(vv.data(:));
Fortran unformatted 顺序存取文件读取
写文件的F90代码如下:
real:: aa(10,20)
aa=reshape((/((i,j=1,10),i=1,20)/),(/10,20/))
open(12,file=‘test.dat’,fo