1. Matlab 读nc文件 ( 读取单个点的数据 )
% 读nc文件
tic
lon = ncread('longtime_test.rtm.h0.1961-03.nc','lon');
lat = ncread('longtime_test.rtm.h0.1961-03.nc','lat');
lon_inx = find(lon== 107.25);
lat_inx = find(lat==25.25);
month_name = {'01' '02' '03' '04' '05' '06' '07' '08' '09' '10' '11' '12'};
for yr = 1:20
for mn = 1:12
filename = ['longtime_test.rtm.h0.',num2str(yr+1977),'-',month_name{mn},'.nc']
temp_liq = ncread(filename,'QCHANR');
QCHANR(yr,mn) = temp_liq(lon_inx,lat_inx)
temp_ice = ncread(filename,'QCHANR_ICE');
QCHANR_ICE(yr,mn) = temp_ice(lon_inx,lat_inx)
end
end
Q_mod = QCHANR + QCHANR_ICE
toc
2. Matlab 读nc文件 ( 读取整个网格数据 )
前情提要:读取的文件夹中有600个nc文件,分为50年,每月1个,共计600个。形状结构为192行×288列。
% 【摘要】读取 Clm45Sp 计算出来的nc结果,计算年平均和月平均值
%(1)读数据
clc; clear; close all
fpath = 'D:\Models_Output\Clm50Sp\lnd\hist\';
filelist = dir([fpath,'*.nc'])
%(2)读取 Clm45Sp 模拟值,变量为QRUNOFF,即 Runoff(mm/s)
% 读经纬度
fname = filelist(1).name;
lonsim = ncread([fpath,fname],'lon');
latsim = ncread([fpath,fname],'lat');
% 根据文件在文件夹中的顺序读取指定变量
for i = 121:600 % spin up 10年(10*12月),故从121开始,共40a
fname = filelist(i).name;
tmp = ncread([fpath,fname],'QRUNOFF');
rofsim{i-120} = tmp;
end
% (3)计算多年平均值
rofsim = reshape(rofsim,[12,40]); % 读取的是月平均,重塑cell形状
[aa,bb] = size(rofsim{1}); % 设置一个和cell中矩阵形状相同的矩阵;
sumrofsim_yr = zeros(aa,bb);
for j = 1:40
sumtemp = zeros(aa,bb); % 注意这个可能会不断累加而导致结果错误,注意回收!
for k = 1:12
temp = rofsim{k,j};
sumtemp = sumtemp + temp;
end
rofsim_yr{j} = sumtemp/12*3600*24*30*12; % 转化为年nuit:mm/year
sumrofsim_yr = sumrofsim_yr + rofsim_yr{j};
end
rofsim_yrly = sumrofsim_yr/40;
%(4)调整经度的分布(有些是[-180,180],有些是[0,360],注意区别和转置)
% 此处 -180对应0, 180对应360
rofsim_yrly = rofsim_yrly';
rofsim_yrly = [rofsim_yrly(:,145:end),rofsim_yrly(:,1:144)];
h = pcolor(rofsim_yrly);
h.LineStyle = 'none';
colormap;
colorbar;
figure(2)
hist(rofsim_yrly); % 显示条型分布图
% 保存变量到指定文件夹
save('D:\数据\UNH-GRDC\World Runoff Data\runoff_grd\simres.mat','rofsim_yrly')
未完待续……