插值
什么是插值?
- 通常实验测量或者采集的数据都是离散数值;
- 插值是指在所给的基准数据情况下,研究如何平滑地估算出基准数据之间其它点的函数数值;
- 一些点的数据无法获得,或者获取这些点的数据代价较高时,插值就会发挥很大的作用;
插值方法
- 最近点插值:
- 线性插值:
更高精度的插值:
- 多项式插值;
- 埃尔米特插值;
- 样条插值;
MATLAB提供的插值函数
在MATLAB中,插值函数保存在MATLAB工具箱的polyfun子目录下;
插值函数按插值变量的个数分为:
- 一维插值
- 二维插值
- 多维插值
一维插值
vq=interpl(x,v,xq)
- 使用**线性插值(默认)**返回一维函数在特定查询点的插入值。
- 向量x包含样本点,v包含对应值v(x);(都是离散值)
- 向量xq包含查询点的坐标,可以是多个查询点构成的向量;
- 若有多个在同一点坐标采样的数据集,则可以将ⅴ以数组的形式进行传递。数组V的每一列都包含一组不同的一维样本值。
vq=interpl(x,v,xq,method)
- 指定备选插值方法:‘linear’、‘nearest’、‘next’、‘previous’、‘pchip’、‘cubic’、‘v5cubic’、‘makima’或’spline’。默认方法为’linear’。
vq=interpl(x,v,xq,method,extrapolation)
- 用于指定外插策略,来计算落在x域范围外的点。如果希望使用method算法进行外插,可将extrapolation设置为’extrap’。也可以指定一个标量值,这种情况下,interpl将为所有落在x域范围外的点返回该标量值。
常用插值方法介绍
方法 | 说明 |
---|---|
‘linear’ | 线性插值;查询点基于各维中邻点网格点处数值的线性插值(默认方法),至少2个点。 |
‘nearest’ | 最近点插值;在查询点插入的值是距样本网格点最近的值,至少2个点。 |
‘pchip’ | 保形分段三次插值。在插值点插入的值基于邻点网格点处数值的保形分段三次插值,至少4个点。 |
‘cubic’ | 同’pchip’ |
‘spline’ | 使用非终止条件的样条插值,在查询点插入的值基于各维中邻点网格点处的数值的三次插值,至少4个点。 |
‘makima’ | 修正Akima三次Hermite插值。在查询点插入的值基于次数最大为3的多项式分段函数少2个点。 |
例子:
x = 0:pi/4:2*pi;
v = sin(x);
xq = 0:pi/16:2*pi;
figure;
vq1 = interp1(x,v,xq);
plot(x,v,'o',xq,vq1,':.');
xlim([0 2*pi]);
title('linear interpolation');
vq2 = interp1(x,v,xq,'spline');
figure;
plot(x,v,'o',xq,vq2,':.');
xlim([0 2*pi]);
title('spline interpolation');
在一个查询点插入多组数据
x= (-5:5)';
v1=x.^2;
v2=2*x.^2+2;
v3=3*x.^2+4;
v= [v1,v2,v3];
xq=-5:0.1:5;
vq=interp1(x,v,xq,'pchip');
figure;
plot(x,v1,'o',x,v2,'o',x,v3,'o',xq,vq);
legend('x^2','x^3','x^4','interpolated');
h=gca;
h.XTick=-5:5;
二维插值
Vq=interp2(X,Y,V,Xq,Yq)
- 使用线性插值返回双变量函数在特定查询点的插入值。结果始终穿过函数的原始采样。
- X和Y包含样本点的坐标。V包含各样本点处的对应函数值。
- Xq和Yq包含查询点的坐标。
Vq=interp2(V,k)
- 将每个维度上样本值之间的间隔反复分割k次,形成优化网格,并在这些网格上返回插入值。这将在样本值之间生成2k-1个插入点。
Vq=interp2(,method)
- 指定备选插值方法:‘linear’、‘nearest’、‘cubic’、‘makima’或’spline’。默认方法为’linear’;
Vq=interp2(,method,extrapval)
- 指定标量值extrapval,此参数会为处于样本点域范围外的所有查询点赋予该标量值。如果样本点域范围外的查询省略extrapval参数,则基于method参数,interp2返回下列值之一:对于’spline’和’makima’方法,返回外插值;对于其他内插方法,返回NaN值;
例子:
[X,Y] = meshgrid(-3:3);
V = peaks(X,Y);
figure;
surf(X,Y,V);
title('original data');
[Xq,Yq] = meshgrid(-3:0.2:3);
Vq = interp2(X,Y,V,Xq,Yq);
figure;
surf(Xq,Yq,Vq);
title('interpolated data');
Vq = interp2(X,Y,V,Xq,Yq,'cubic');
figure;
surf(Xq,Yq,Vq);
title('interpolated data with cubic method');
二维插值一优化灰度图像
load flujet.mat
colormap gray
%隔离图像的一个小区域并将其转换为单精度
V=single(X(200:300,1:25));
%显示该图像区域
imagesc(V);
axis off
title('Original Image')
多维插值函数
Vq=interpn(X1,X2,…Xn,V,Xql,Xq2,…Xgn)
- 使用线性插值返回变量函数在特定查询点的插入值;结果始终穿过函数的原始采样;
- X1,X2,Xn包含样本点的坐标,V包含各样本点处的对应函数值;
- Xql,Xq2,Xqn包含查询点的坐标;
Vq=interpn(,method)
- 指定备选插值方法:‘linear’、‘nearest’、‘pchip’、‘cubic’、‘makima’或’spline’。默认方法为’linear’;