什么是插值?
正常我们进行数据处理时,是希望得到一个线性的数据,但是在数据极少的情况下,数据不足以支撑分析的进行,对已知的函数点进行数据、模型的处理和分析,这时就需要使用一些数学的方法,产生一些新的但又比较靠谱的值来满足分析需求。我们去调用MATLAB的一些库函数来实现,这个功能就是“插值”
插值法:
插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。
简单说:就是根据已知数据点(条件),来预测未知数据点值得方法
比方说你知道了前五年的人口数量和增长率,要求预测未来五年的人口数量,这时便需要一个
interpl( )一维插值函数
格式:
yi=interpl (x, y, xi, 'method')
功能:为给定的数据对(x,y)以及x坐标上的插值范围向量xi,用指定所使用的插值方法method实现插值。yi是插值后的对应数据点集的y坐标
简单来说:已知样本点坐标x,y,求xi处的函数值yi,插值方法是method。
也就是我们所说的函数方程的求解
插值的方法method有以下5种可供选择:
nearest(最邻近插值法)
linear(线性插值)
spline(三次样条插值)
cubic(三次立方插值)
pchip(三次Hermite插值)
默认为 linear(线性插值)
常用的为’spline’和’cubic’
举例:
x=0:20;
y=x.*sin(x);
x1=0:0.25:10;
y1=interp1(x,y,x1);
plot(x,y,'kd',x1,y1)
四种插值方法比较:
x=0:20;
y=x.*sin(x);
x1=0:0.25:20;
%分段线性插值
y1=interp1(x,y,x1);
figure
subplot(2,2,1)
plot(x,y,'kd',x1,y1,'r')
title('分段线性插值')
%最邻近插值法nearest
y2=interp1(x,y,x1,'nearest');
subplot(2,2,2)
plot(x,y,'kd',x1,y2,'r');
title('最邻近插值法nearest')
%三次样条插值spline
y3=interp1(x,y,x1,'spline');
subplot(2,2,3)
plot(x,y,'o',x1,y3,'r')
title('三次样条插值spline')
%立方插值法
y4=interp1(x,y,x1,'cubic');
subplot(2,2,4)
plot(x,y,'o',x1,y4,'r');
title('立方插值cubic')
由上图可以看出:
这几种方法在速度、平滑性、内存使用方面有所区别,在使用时可以根据实际需要进行选择。包括:
1最临近插值是最快的方法,但是使用它得到的结果平滑性最差。
2线性插值要比最邻近插值占用更多的内存,运行时间略长。与最近邻插值不同,它生成的结果是连续的,但在顶点处会有坡度变化。
3三次多项式插值需要更多的内存,而且运行时间比最邻近法和线性插值要长。但是,在使用此法时,插值数据及其导数都是连续的。
4立方插值的运行时间相对来说最长,内存消耗比三次插值略少。它生成的结果平滑性最好。
1 linear(线性插值)
线性插值
线性插值是利用斜率曲线对一个或多个自变量和因变量之间关系进行建模的一种回归分析
线性插值是用一系列首尾相连的线段依次连接相邻各点,每条线段内的点的高度作为插值获得的高度值。我们知道其斜率是相等的
也就是:
以(x0,y0)表示某条线段的前一个端点,(x1,y1)表示该线段的后一个端点,则对于在[x0,x1]范围内的横坐标为x的点,其高度y为:
化简后最后公式的表示:
2 最邻近插值法
就是根据邻近的两个数值,计算其平均值,然后根据数值的缩放倍数,
四舍五入选取最接近的整数
这样的做法就会导致数据的变化不连续,
Cubic立方插值
如果想要保证各段曲线连接处光滑(一阶导数相同),并且不想使用除法运算,可以考虑Cubic插值函数:
其中,v代表插值点,v0、v1、v2、v3代表4个连续的节点。t取值为[0,1],将会产生一段连接v1和v2的曲线。也就是说,如果有n个节点,Cubic插值函数将会产生(n-2)段曲线,位于首尾两端的节点不会纳入曲线。
4三次样条插值spline
用分段三次多项式曲线光滑地连接相邻样本点,整体上具有函数、一阶和二阶导数连续性
具体请参看
三次样条插值 cubic spline interpolation
interp2
功能 二维数据内插值(表格查找)
格式
ZI = interp2(X,Y,Z,XI,YI)
这里X,Y,是已有X,和Y的坐标,Z是表示Z=(X,Y)以为x行y为列的矩阵 X,Y,Z是同维数矩阵表示网格数据
XI 和 YI 是查询点的坐标,ZI是同维数矩阵表示插值点.
简单说:
ZI=interp2(x,y,z,xi,yi)其中,x,xi为行向量,y,yi为列向量. Z为x行y列的矩阵
本质也就是在 X等于某个值 Y等于某个值的情况下 求该点的Z值
我们举个例子:
行3-D绘图操作时,涉及到x、y、z三组数据,而x、y这两组数据可以看做是在Oxy平面内对坐标进行采样得到的坐标对(x,y)
那么我们现在采集9个点,(x,y) 就可以知道对应点的Z 的值
(0,0),(1,9),(2,0);
(0,1),(1,1),(2,1);
(0,2),(1,2),(2,2);
把个点的x坐标单独列出来
再把个点的Y坐标单独列出来
那么九个坐标点对应的Z值为:
也就是本质就是 X存储行 Y存储列 而Z为对应位置的值
返回矩阵ZI:
其元素包含对应于参量XI 与YI(可以是向量、或同型矩阵) 的元素,
即Zi(i,j) ==[Xi(i,j),yi(i,j)]。
若Xi与Yi 中有在X 与Y范围之外的点,则相应地返回nan(Not a Number)
二维线性插值与一维线性插值插值法相同,同为以下几种
ZI = interp2(X,Y,Z,XI,YI,method)
用指定的算法method 计算二维插值:
’linear’:双线性插值算法(缺省算法);
’nearest’:最临近插值;
’spline’:三次样条插值;
’cubic’:双三次插值。
我们还是来举一个例子
meshgrid函数:
用法: [X,Y]=meshgrid(x,y)
简单地说,就是产生Oxy平面的网格坐标。
[X,Y]=meshgrid(0:2,0:2)
将行坐标和列坐标分开存储再两个矩阵当中,
x、y结合,便表示了一个坐标矩阵。meshgrid就是产生这样两个矩阵
那么我们来看下面的代码:
[x,y]=meshgrid(0:2,0:2)
z = [1:3;4:6;7:9]
surf(x,y,z)
[x2,y2]=meshgrid(1:0.1:2,0:0.1:2)
z1 = interp2(x,y,z,x2,y2,'cubic');
surf(x2,y2,z1)
其中x 和 y 的范围为 0:2 间隔为1 已知9个z值数据
那么 x2 和 y2 的取值 就要在0 和2之间 否则就会返回nan(Not a Number)
所以定义x2和y2 的范围为 0:2 间隔为0.1 求在该范围内对应z1的值
插值前的图像坐标及对应值
只有 0,1,2 处有对应数值插值后的图像坐标及对应值