MATLAB计算与建模常见函数:4.插值

插值

什么是插值?

  • 通常实验测量或者采集的数据都是离散数值
  • 插值是指在所给的基准数据情况下,研究如何平滑地估算出基准数据之间其它点的函数数值
  • 一些点的数据无法获得,或者获取这些点的数据代价较高时,插值就会发挥很大的作用;

插值方法

  • 最近点插值:
  • 线性插值:

更高精度的插值:

  • 多项式插值;
  • 埃尔米特插值;
  • 样条插值;

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个点。

例子:

matlab 复制代码
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');

在一个查询点插入多组数据

matlab 复制代码
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值;
    例子:
matlab 复制代码
[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');

二维插值一优化灰度图像

matlab 复制代码
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';
相关推荐
kyle~34 分钟前
C++---嵌套类型(Nested Types)封装与泛型的基石
开发语言·c++·算法
sali-tec37 分钟前
C# 基于halcon的视觉工作流-章48-短路断路
开发语言·图像处理·人工智能·算法·计算机视觉
墨染点香1 小时前
LeetCode 刷题【128. 最长连续序列】
算法·leetcode·职场和发展
被AI抢饭碗的人1 小时前
算法题(240):最大食物链计数
算法
熬了夜的程序员1 小时前
【LeetCode】82. 删除排序链表中的重复元素 II
数据结构·算法·leetcode·链表·职场和发展·矩阵·深度优先
欧克小奥1 小时前
Floyd判圈算法(Floyd Cycle Detection Algorithm)
算法·floyd
墨利昂2 小时前
机器学习和深度学习模型训练流程
人工智能·深度学习·机器学习
无风听海2 小时前
神经网络之从自由度角度理解方差的无偏估计
神经网络·机器学习·概率论
熬了夜的程序员2 小时前
【LeetCode】83. 删除排序链表中的重复元素
算法·leetcode·链表
胖咕噜的稞达鸭3 小时前
AVL树手撕,超详细图文详解
c语言·开发语言·数据结构·c++·算法·visual studio