其实作为只把程序当工具的人来说,在写之前一定要仔细查查matlab有没有相关的函数可以简化工作量。
参考这个问题,与其不同的是,我是由高精度到低精度,其实是个求和的过程。
https://www.ilovematlab.cn/thread-544157-1-1.html
https://jingyan.baidu.com/article/4853e1e57ab56d1909f726a0.html
以下是程序:
A(从低精度到高精度的插值)
z1=interp2(x0,y0,z0,x1,y1,'method')
功能介绍:根据已知的数据(x0,y0,z0),用method方法进行插值,然后计算(x1,y1)对应的值z1.
用指定的算法method 计算二维插值:
’linear’:双线性插值算法(缺省算法);
’nearest’:最临近插值;
’spline’:三次样条插值;
’cubic’:双三次插值。
代码以下:
x=1.1:0.1:1.5;
y=1.1:0.1:1.5;
[x,y]=meshgrid(x,y);
z=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20;21,22,23,24,25];
x1=1.1:0.25:1.5;
y1=1.1:0.25:1.5;
[x1,y1]=meshgrid(x1,y1);
z1=interp2(x,y,z,x1,y1,'cubic');
B(从高精度到低精度,例如我需要从0.1°到0.25°,不是整数倍,可参考以下程序)
%遥感产品空间精度重采样,0.1°到0.25°
%for时间序列循环读入矩阵B
%B矩阵需要切掉2行1列
ini_year=2014; %输入计算起始年份
end_year=2018; %输入计算终止年份
NCOLS=20; %数据集列数
NROWS=12; %数据集行数
for year=ini_year:end_year
%确定每年的天数是365或366天
if year/4==fix(year/4)
daynum=366;
else
daynum=365;
end
for day=1:daynum
%读入初始分辨率的日数据
B=load(strcat('F:\黑河+GPM(写论文中)\GPM data\GPMtxt\GPMV6',num2str(YYMMDD(year,day)),'.txt'));
B=B(3:32,2:51);
A=zeros(12,20);
for i=1:12
for j=1:20
a=2*i+floor(i/2)-1;%奇数行
b=2*(i-1)+floor((i-1)/2)+1;%偶数行
c=2*j+floor(j/2)-1;%奇数列
d=2*(j-1)+floor((j-1)/2)+1;%偶数列
if mod(i,2) == 0
if mod(j,2) == 0 %3 b d
A(i,j)=sum(sum(B(b+1:b+2,d+1:d+2)))+0.5*(sum(sum(B(b,d+1:d+2)))+sum(sum(B(b+1:b+2,d))))+0.25*sum(sum(B(b,d)))
else %4 b c
A(i,j)=sum(sum(B(b+1:b+2,c:c+1)))+0.5*(sum(sum(B(b,c:c+1)))+sum(sum(B(b+1:b+2,c+2))))+0.25*sum(sum(B(b,c+2)))
end
else
if mod(j,2) == 0 %2 a d
A(i,j)=sum(sum(B(a:a+1,d+1:d+2)))+0.5*(sum(sum(B(a+2,d+1:d+2)))+sum(sum(B(a:a+1,d))))+0.25*sum(sum(B(a+2,d)))
else %1 a c
A(i,j)=sum(sum(B(a:a+1,c:c+1)))+0.5*(sum(sum(B(a+2,c:c+1)))+sum(sum(B(a:a+1,c+2))))+0.25*sum(sum(B(a+2,c+2)))
end
end
%储存模型计算所需分辨率的列数据
fid=fopen(strcat('F:\黑河+GPM(写论文中)\GPM data\GPM025\GPMV6',num2str(YYMMDD(year,day)),'.txt'),'wt');
for I=1:NROWS
for J=1:NCOLS
if J==NCOLS
fprintf(fid,'%3.2f\n',A(I,J));
else
fprintf(fid,'%3.2f\t',A(I,J));
end
end
end
fclose(fid);
end
end
end
end