国际刑警组织
|
页面进行中。 |
一维数据插值(搜索表)。
库::`工程师`
语法
争论
输入参数
# v — 样本值
+
向量资料 | 矩阵 | 阵列
Details
指定为实数或复数的向量、矩阵或数组的样本值。 如果 v -矩阵或数组,则每列包含一组单独的一维值。
如果 v 包含复数,则函数 interp1 分别内插实部和虚部。
| 数据类型 |
|
# 方法 — 插值方法
+
"线性" (默认情况下)| "最近" | "下一个" | "上一篇" | "pchip" | "立方" | "v5cubic" | "牧马" | "样条"
Details
指定为此表中的选项之一的插值方法。
| 方法 | 资料描述 | 连续性 | 评论 |
|---|---|---|---|
|
线性插值。 查询点处的内插值基于在每个相应维度中的相邻网格点处的值的线性内插。 这是默认的插值方法。 |
|
*需要至少2个点 * 它比最近邻插值需要更多的内存和计算时间。 |
|
最近邻插值。 查询点处的插值值是采样网格中最近点处的值。 |
间歇性 |
*需要至少2个点 * 低内存要求 * 最快的计算时间 |
|
插值到下一个邻居。 查询点处的插值值是选择网格中下一个点处的值。 |
间歇性 |
*需要至少2个点
* 与……相同的内存需求和计算时间 |
|
前邻居的插值。 查询点处的内插值是选择网格中前一点处的值。 |
间歇性 |
*需要至少2个点
* 与……相同的内存需求和计算时间 |
|
分段三次保形插值。 查询点处的插值值基于相邻网格点处的值的分段三次插值,同时保留形状。 |
|
*至少需要4分
* 需要更多的内存和计算时间比 |
|
*Engee*中使用的三次卷积。 |
|
*至少需要3分
* 点应均匀分布
* 对于分布不均匀的数据,该方法使用插值。 |
|
同为 |
|
|
|
Akim的修正插值由三次埃尔米特多项式。 查询点处的内插值基于程度不高于第三的多项式的分段线性函数。 Akim的公式已被修改,以防止排放。 |
|
*需要至少2个点
* 产生的起伏少于 |
|
使用"not-a-knot"条件的样条插值。 查询点处的内插值基于每个相应维度中相邻网格点处的值的三次内插。 |
|
*至少需要4个点,如果有2个或3个点,则分别应用线性或二次插值。
* 它需要更多的内存和计算时间比 |
# 外推法 — 外推策略
+
"额外" | 标量,标量
Details
外推策略,定义为 "额外" 或真正的标量值。
-
指定
"额外"如果你想让函数interp1使用与用于插值相同的方法计算定义区域之外的点。 -
如果要函数指定标量值
interp1为定义区域之外的点返回某个常量值。
默认行为取决于输入参数:
-
如果指定了插值方法
"pchip","样条"或"牧马",默认行为为 —"额外". -
所有其他插值方法默认返回
南于定义区域之外的查询点。
| 数据类型 |
|
输出参数
# vq — 插值值
+
标量,标量 | 向量资料 | 矩阵 | 阵列
Details
表格 v |
表格 xq系列 |
大小 vq的 |
例子: |
|---|---|---|---|
向量资料 |
向量资料 |
|
如果 |
向量资料 |
矩阵或N维数组 |
|
如果 |
矩阵或N维数组 |
向量资料 |
|
如果 |
矩阵或N维数组 |
矩阵或N维数组 |
|
如果 |
例子:
近似采样的正弦函数的插值
Details
让我们定义采样点 x 和相应的样本值 v.
x = 0:π/4:2π
v = sin.(x)
让我们定义查询点,以便在范围内进行更准确的选择 x.
xq = 0:π/16:2π
我们在查询点内插函数并绘制结果图。
import EngeeDSP.Functions: interp1
vq1 = interp1(x, v, xq)
plot(xq, vq1, linestyle = :dot)
scatter!(x, v,
markershape = :circle,
xlims = (0, 2π),
title = "(Default) Linear Interpolation")
现在让我们评估一下 v 在相同的点上,使用该方法 "样条".
vq2 = interp1(x, v, xq, "spline")
plot(xq, vq2, linestyle = :dot)
scatter!(x, v,
markershape = :circle,
xlims = (0, 2π),
title = "Spline Interpolation")
不指定点的插值
Details
让我们定义一组函数值。
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
让我们评估一下 v 在点 xq系列.
import EngeeDSP.Functions: interp1
vq = interp1(v, xq)
让我们绘制结果图。
plot(1:9, v,
seriestype = :scatter,
markershape = :circle,
label = "v")
plot!(xq, vq,
seriestype = :scatter,
markershape = :diamond,
label = "vq")
复杂值的插值
Details
让我们定义一组样本点。
x = 1:10
定义函数的值 在样本点。
v = 5*x + x.^2*1im
让我们定义查询点,以便在范围内进行更准确的选择 x.
xq = 1:0.25:10
插值;插值 v 在请求点。
import EngeeDSP.Functions: interp1
vq = interp1(x, v, xq)
我们将用红色表示结果的实部,用蓝色表示虚部。
plot(x, real(v),
seriestype = :scatter,
color = :red,
markershape = :diamond)
plot!(xq, real(vq), color = :red)
plot!(x, imag(v),
seriestype = :scatter,
color = :blue,
markershape = :diamond)
plot!(xq, imag(vq), color = :blue)
使用两种不同方法进行外推
Details
让我们定义采样点 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]
让我们评估一下 v 在点 xq系列 使用方法 "pchip".
import EngeeDSP.Functions: interp1
vq1 = interp1(x, v, xq, "pchip")
5-element Vector{Float64}:
19.36842105263158
13.631578947368421
13.210526315789474
7.48
12.559999999999999
接下来,让我们评估一下 v 在点 xq系列 使用方法 "线性".
vq2 = interp1(x, v, xq, "linear")
5-element Vector{Float64}:
NaN
NaN
14.0
NaN
NaN
现在我们使用的方法 "线性" 与选项 "额外".
vq3 = interp1(x, v, xq, "linear", "extrap")
5-element Vector{Float64}:
8.0
10.0
14.0
4.0
2.0
"pchip" 默认情况下进行外推,以及 "线性" -不。
为x定义范围之外的所有查询分配常量值
Details
让我们定义采样点 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]
现在让我们评估一下 v 在点 xq系列 使用方法 "pchip",并赋值给定义范围之外的任何值 x 意义 27.
import EngeeDSP.Functions: interp1
vq = interp1(x, v, xq, "pchip", 27)
6-element Vector{Float64}:
27.0
18.65625
0.9375
0.9375
18.65625
27.0
一次内插多个数据集
Details
让我们定义采样点。
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系列 让我们绘制结果。
import EngeeDSP.Functions: interp1
vq = interp1(x, v, xq, "pchip")
plot(x,v,seriestype=:scatter,markershape=:circle)
阴谋!(xq,vq,xticks=(-5:5))
图上的圆圈表示 v,而实线表示 vq的.
此外
Akim和样条插值
Details
Akim’s algorithm for one-dimensional interpolation,described in[1]and[2],执行三次插值以获得具有连续一阶导数的分段多项式( ). 该算法保留了坡度,避免了平坦区域的起伏。 当算法用直线连接三个或更多连续共线点时,就会出现平坦部分。 要确保两个数据点之间的区域是平坦的,请在它们之间插入一个额外的数据点。
当两个具有不同斜率的平坦区域相交时,对Akim原始算法的修改为斜率更接近于零的一侧赋予了更多权重。 这种修改优先考虑更接近水平的一侧,这更直观,避免了超调。 (Akim的原始算法为两侧的点赋予相等的权重,从而均匀分布起伏。)
另一方面,*样条算法*执行三次插值以获得具有连续二阶导数的分段多项式( 结果与常规多项式插值相当,但较不易受数据点之间的强烈波动的影响。 然而,这种方法可能受到数据点之间的异常值和波动的影响。
与样条算法相比,Akim算法产生的类似波浪的振荡更少,更适合处理平坦区域之间的快速变化。