interp1一维数据插值在matlab中的用法
转载:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1
interp1
一维数据插值(表查找)
语法
说明
指定外插策略,并使用默认样本点。vq
= interp1(v
,xq
,method
,extrapolation
)
使用 pp
= interp1(x
,v
,method
,'pp')method
算法返回分段多项式形式的 v(x)。
注意
不建议使用该语法。请改用 griddedInterpolant
。
示例
基于粗略采样的正弦函数进行插值
定义样本点 x
及其对应样本值 v
。
- x = 0:pi/4:2*pi;
- v = sin(x);
将查询点定义为 x
范围内更精细的采样点。
- xq = 0:pi/16:2*pi;
在查询点插入函数并绘制结果。
- figure
- vq1 = interp1(x,v,xq);
- plot(x,v,'o',xq,vq1,':.');
- xlim([0 2*pi]);
- title('(Default) Linear Interpolation');
现在使用 'spline'
方法计算相同点处的 v
。
- figure
- vq2 = interp1(x,v,xq,'spline');
- plot(x,v,'o',xq,vq2,':.');
- xlim([0 2*pi]);
- title('Spline Interpolation');
在不指定样本点的情况下进行插值
定义一组函数值。
- v = [0 1.41 2 1.41 0 -1.41 -2 -1.41 0];
定义一组介于默认点 1:9
之间的查询点。在这种情况下,默认点为 1:9
,因为 v
包含 9
个值。
- xq = 1.5:8.5;
计算 xq
处的 v
。
- vq = interp1(v,xq);
绘制结果。
- figure
- plot((1:9),v,'o',xq,vq,'*');
- legend('v','vq');
复数值插值
定义一组样本点。
- x = 1:10;
定义函数 v(x)=5x+x2i 在样本点处的值。
- v = (5*x)+(x.^2*1i);
将查询点定义为 x
范围内更精细的采样点。
- xq = 1:0.25:10;
在查询点处进行 v
插值。
- vq = interp1(x,v,xq);
用红色绘制结果的实部,用蓝色绘制虚部。
- figure
- plot(x,real(v),'*r',xq,real(vq),'-r');
- hold on
- plot(x,imag(v),'*b',xq,imag(vq),'-b');
日期和时间的插值
对时间戳数据点进行插值。
以包含温度读数的数据集为例,这些读数每四个小时测量一次。创建包含一天的数据的表,并绘制数据图。
- x = (datetime(2016,1,1):hours(4):datetime(2016,1,2))';
- x.Format = 'MMM dd, HH:mm';
- T = [31 25 24 41 43 33 31]';
- WeatherData = table(x,T,'VariableNames',{'Time','Temperature'})
- WeatherData=7×2 table
- Time Temperature
- _____________ ___________
- Jan 01, 00:00 31
- Jan 01, 04:00 25
- Jan 01, 08:00 24
- Jan 01, 12:00 41
- Jan 01, 16:00 43
- Jan 01, 20:00 33
- Jan 02, 00:00 31
- plot(WeatherData.Time, WeatherData.Temperature, 'o')
插入数据集以预测一天中每一分钟内的温度读数。由于数据是周期性的,因此请使用 'spline'
插值方法。
- xq = (datetime(2016,1,1):minutes(1):datetime(2016,1,2))';
- V = interp1(WeatherData.Time, WeatherData.Temperature, xq, 'spline');
绘制插入的点。
- hold on
- plot(xq,V,'r')
使用两种不同方法进行外插
定义样本点 x
及其对应样本值 v
。
- x = [1 2 3 4 5];
- v = [12 16 31 10 6];
指定查询点 xq
,这些查询点延伸到 x
的定义域以外。
- xq = [0 0.5 1.5 5.5 6];
使用 'pchip'
方法计算 xq
处的 v
。
- vq1 = interp1(x,v,xq,'pchip')
- vq1 = 1×5
- 19.3684 13.6316 13.2105 7.4800 12.5600
接着,使用 'linear'
方法计算 xq
处的 v
。
- vq2 = interp1(x,v,xq,'linear')
- vq2 = 1×5
- NaN NaN 14 NaN NaN
现在将 'linear'
方法与 'extrap'
选项结合使用。
- vq3 = interp1(x,v,xq,'linear','extrap')
- vq3 = 1×5
- 8 10 14 4 2
'pchip'
默认外插,但 'linear'
不会。
为 x 域范围外的所有查询指定常量值
定义样本点 x
及其对应样本值 v
。
- x = [-3 -2 -1 0 1 2 3];
- v = 3*x.^2;
指定查询点 xq
,这些查询点延伸到 x
的定义域以外。
- xq = [-4 -2.5 -0.5 0.5 2.5 4];
现在使用 'pchip'
方法计算 xq
处的 v
,并为 x
域范围外的所有查询点赋予值 27
。
- vq = interp1(x,v,xq,'pchip',27)
- vq = 1×6
- 27.0000 18.6562 0.9375 0.9375 18.6562 27.0000
在一个传递点插入多组数据
定义样本点。
- x = (-5:5)';
在 x
所定义的点处对三个不同的抛物线函数采样。
- v1 = x.^2;
- v2 = 2*x.^2 + 2;
- v3 = 3*x.^2 + 4;
创建矩阵 v
,其列为向量 v1
、v2
和 v3
。
- v = [v1 v2 v3];
将一组查询点 xq
定义为 x
范围内更精细的采样点。
- xq = -5:0.1:5;
计算 xq
处的全部三个函数,并绘制结果。
- vq = interp1(x,v,xq,'pchip');
- figure
- plot(x,v,'o',xq,vq);
- h = gca;
- h.XTick = -5:5;
绘图中的圆圈表示 v
,实线表示 vq
。
输入参数
x
- 样本点
向量
样本点,指定为一行或一列实数向量。x
中的值必须各不相同。x
的长度必须符合以下要求之一:
如果
v
为向量,则length(x)
必须等于length(v)
。如果
v
为数组,则length(x)
必须等于size(v,1)
。
示例: [1 2 3 4 5 6 7 8 9 10]
示例: 1:10
示例: [3 7 11 15 19 23 27 31]'
数据类型: single
| double
| duration
| datetime
v
- 样本值
向量 | 矩阵 | 数组
样本值,指定为实数/复数向量、矩阵或数组。如果 v
是矩阵或数组,则每列包含单独的一组一维值。
如果 v
包含复数,则 interp1
将分别插入实部和虚部。
示例: rand(1,10)
示例: rand(10,1)
示例: rand(10,3)
数据类型: single
| double
| duration
| datetime
复数支持: 是
xq
- 查询点
标量 | 向量 | 矩阵 | 数组
查询点,指定为实数标量、向量、矩阵或数组。
示例: 5
示例: 1:0.05:10
示例: (1:0.05:10)'
示例: [0 1 2 7.5 10]
数据类型: single
| double
| duration
| datetime
method
- 插值方法
'linear'
(默认) | 'nearest'
| 'next'
| 'previous'
| 'pchip'
| 'cubic'
| 'v5cubic'
| 'makima'
| 'spline'
插值方法,指定为下表中的选项之一。
方法 |
说明 |
连续性 |
注释 |
---|---|---|---|
|
线性插值。在查询点插入的值基于各维中邻点网格点处数值的线性插值。这是默认插值方法。 |
C0 |
|
|
最近邻点插值。在查询点插入的值是距样本网格点最近的值。 |
不连续 |
|
|
下一个邻点插值。在查询点插入的值是下一个抽样网格点的值。 |
不连续 |
|
|
上一个邻点插值。在查询点插入的值是上一个抽样网格点的值。 |
不连续 |
|
|
保形分段三次插值。在查询点插入的值基于邻点网格点处数值的保形分段三次插值。 |
C1 |
|
注意
|
与 |
C1 |
此方法目前返回与 |
|
用于 MATLAB 5 的三次卷积。 |
C1 |
点之间的间距必须均匀。 |
|
修正 Akima 三次 Hermite 插值。在查询点插入的值基于次数最大为 3 的多项式的分段函数。为防过冲,已修正 Akima 公式。 |
C1 |
|
|
使用非结终止条件的样条插值。在查询点插入的值基于各维中邻点网格点处数值的三次插值。 |
C2 |
|
extrapolation
- 外插策略
'extrap'
| 标量值
外插策略,指定为 'extrap'
或实数标量值。
如果希望
interp1
使用与内插所用相同的方法来计算落在域范围外的点,则指定'extrap'
。如果希望
interp1
为落在域范围外的点返回一个特定常量值,则指定一个标量值。
默认行为取决于输入参数:
如果您指定
'pchip'
、'spline'
或'makima'
插值方法,则默认行为是'extrap'
。任何其他方法都会为落在域范围外的查询点默认返回
NaN
。
示例: 'extrap'
示例: 5
数据类型: char
| string
| single
| double
输出参数
vq
- 插入的值
标量 | 向量 | 矩阵 | 数组
插入的值,以标量、向量、矩阵或数组的形式返回。vq
的大小取决于 v
和 xq
的形状。
v 的形状 | xq 的形状 | Vq 的大小 | 示例 |
---|---|---|---|
向量 | 向量 | size(xq) |
如果 size(v) = [1 100] 且 size(xq) = [1 500] ,则 size(vq) = [1 500] 。 |
向量 | 矩阵 或 N 维数组 |
size(xq) |
如果 size(v) = [1 100] 且 size(xq) = [50 30] ,则 size(vq) = [50 30] 。 |
矩阵 或 N 维数组 |
向量 | [length(xq) size(v,2),...,size(v,n)] |
如果 size(v) = [100 3] 且 size(xq) = [1 500] ,则 size(vq) = [500 3] 。 |
矩阵 或 N 维数组 |
矩阵 或 N 维数组 |
[size(xq,1),...,size(xq,n),... size(v,2),...,size(v,m)] |
如果 size(v) = [4 5 6] 且 size(xq) = [2 3 7] ,则 size(vq) = [2 3 7 5 6] 。 |
pp
- 分段多项式
结构体
分段多项式,以可传递到 ppval
函数进行计算的结构体的形式返回。
详细信息
Akima 和样条插值
[1] 和 [2] 中所述的一维插值 Akima 算法执行三次插值以生成具有连续一阶导数 (C1) 的分段多项式。该算法保持斜率,避免平台区的波动。每当有三个或更多连续共线点时,就会出现平台区,算法将这些点用一条直线相连。为了确保两个数据点之间的区域是平坦的,请在这两个点之间插入一个额外的数据点。
当两个具有不同斜率的平台区相遇时,对原始 Akima 算法所做的修改会对斜率更接近于零的一侧赋予更多权重。此修改优先考虑更接近水平的一侧,这样更直观并可避免过冲。(原始 Akima 算法对两边的点赋予相等的权重,从而均匀地划分波动。)
另一方面,样条算法执行三次插值以产生具有连续二阶导数 (C2) 的分段多项式。结果相当于常规多项式插值,但不太容易受到高次数据点之间剧烈振荡的影响。但这种方法仍容易受到数据点之间的过冲和振荡的影响。
与样条算法相比,Akima 算法产生的波动较少,更适合处理平台区之间的快速变化。下面使用连接多个平台区的测试数据来说明这种差异。
参考
[1] Akima, Hiroshi. "A new method of interpolation and smooth curve fitting based on local procedures." Journal of the ACM (JACM) , 17.4, 1970, pp. 589-602.
[2] Akima, Hiroshi. "A method of bivariate interpolation and smooth surface fitting based on local procedures." Communications of the ACM , 17.1, 1974, pp. 18-20.
扩展功能
interp1一维数据插值在matlab中的用法的更多相关文章
- 向量与矩阵的范数及其在matlab中的用法(norm)
一.常数向量范数 \(L_0\) 范数 \(\Vert x \Vert _0\overset{def}=\)向量中非零元素的个数 其在matlab中的用法: sum( x(:) ~= 0 ) \(L_ ...
- Matlab中imagesc用法
来源:https://ww2.mathworks.cn/help/matlab/ref/imagesc.html?searchHighlight=imagesc&s_tid=doc_srcht ...
- matlab中set用法
来源:https://www.cnblogs.com/sddai/p/5467500.html 1.MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值.例如,Lin ...
- RBF、GRNN 和 PNN 神经网络在Matlab中的用法
一.RBF神经网络 RBF神经网络概述 径向基函数神经网络 与 BP 神经网络的区别在于训练过程--其参数初始化具有一定方法,并非随机,隐含层的末尾使用了径向基函数,它的输出经过加权和得到 LW2.1 ...
- Matlab中ismember用法
>> a = magic(3) a = 8 1 6 3 5 7 4 9 2 >> ismember(a,3) ans = 0 0 0 1 0 0 0 0 0 >> ...
- 从matlab中导出下载到的轨迹数据
我从该网址(http://www.ee.cuhk.edu.hk/~xgwang/MITtrajsingle.html)下载到了一些轨迹数据. 网页中简单说明了轨迹数据的由来:原始数据是在一个停车场上方 ...
- MATLAB/Excel-如何将Excel数据导入MATLAB中
在使用MATLAB对矩阵进行数据处理时,为了方便编辑与修改,常常需要先将数据录入到Excel中,然后再将其导入到MATLAB中参与矩阵运算.本文在MATLAB 2013a和Office 2013环境下 ...
- Matlab中插值函数汇总(上)
Matlab中插值函数汇总分上下两个部分,主要整合自matlabsky论坛dynamic发表于2009-2-21 21:53:26 的主题帖,以及豆丁网rickoon上传的教材第8章<插值,拟合 ...
- [转载]Matlab中插值函数汇总和使用说明
http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,' ...
随机推荐
- e3mall商城总结13之订单确认(有BUG)
说在前面的话 上一节说了购物车的生成,本节主要说了在购物车的列表上去结算,从而生成一个未支付的订单,生成的订单默认状态为1, 题目说的BUG是因为所有数据都是通过前端向后端生成的,包括订单的金额.因此 ...
- 轻量化模型训练加速的思考(Pytorch实现)
0. 引子 在训练轻量化模型时,经常发生的情况就是,明明 GPU 很闲,可速度就是上不去,用了多张卡并行也没有太大改善. 如果什么优化都不做,仅仅是使用nn.DataParallel这个模块,那么实测 ...
- Pytest的装饰器——parametrize中ids里包含中文,用例标题显示异常如何解决?
在使用pytest做测试的过程中,经常会用到pytest.mark.parametrize来对批量生成测试用例,比如 @pytest.mark.parametrize( ['a', 'b', 'exp ...
- wxWidgets教程
https://www.wxwidgets.org/docs/tutorials/ http://zetcode.com/gui/wxwidgets/ https://docs.wxwidgets.o ...
- 写shader小细节——这个会不断更新
这个是因为自己被自己蠢哭了动笔的,里面大概记录自己所犯的错,和一些小知识. 1.有一个错误我经常犯:内部定义的字段没对应开放到编辑器的字段.这个是由于我有点依赖ide写代码的习惯导致,而shader的 ...
- Tomcat之如何自己做一个tomcat
来源:<How Tomcat Works> Servlet容器的工作原理: 1.创建一个request对象并填充那些有可能被所引用的servlet使用的信息,比如参数.头部.cookies ...
- 编程体系结构(01):Java编程基础
一.数据类型 1.基础类型 整型:byte .short .int .long 浮点型:float.double 字节型:char 2.包装类型 Byte,Short,Integer,Long Flo ...
- 开发者的福音,LR.NET模块化代码生成器
代码生成器,是快速开发平台的核心功能之一,是一种用来帮助缺乏经验或者时间的开发者快速生成规范代码的工具,可以在极大程度上提升开发者的工作效率, 能有效避免重复工作.但稍有经验的开发者都明白,代码生成器 ...
- 写给.NET开发者的Python教程(三):运算符、条件判断和循环语句
本节会介绍Python中运算符的用法,以及条件判断和循环语句的使用方法. 运算符 运算符包括算术运算符.赋值运算符.比较运算符.逻辑运算符等内容,大部分用法和C#基本一致,下面我们来看一下: 算数运算 ...
- Agumaster 将爬虫取股票名称代号子系统分出来成agumaster_crawler, 两系统通过RabbitMq连接
agumaster_crawler系统负责启动爬虫取得数据,之后便往队列中推送. agumaster_crawler系统中pom.xml关于RabbitMq的依赖是: <!-- RabbitMq ...