Engee 文档

国际刑警组织

页面进行中。

一维数据插值(搜索表)。

库::`工程师`

语法

函数调用

  • [参数:vq]=interp1(<参数:x>>,<参数:v>>,<参数:xq>>) -返回指定查询点处一维函数的插值值。 默认函数为 interp1 使用线性插值。 向量资料 [参数:x] 包含样本点,以及 [参数:v] -相关价值 . 向量资料 [参数:xq] 包含查询点的坐标。

    如果您有多个从相同点接收的数据集,则可以传输 [参数:v] 作为阵列。 数组的每一列 [参数:v] 它包含自己的一组一维样本值。

  • [参数:vq]=interp1(<参数:x>>,<参数:v>>,<参数:xq>>,<参数:方法>>) -定义替代插值方法: "线性", "最近", "下一个", "上一篇", "pchip", "立方", "v5cubic", "牧马""样条". 默认方法 — "线性".

  • [参数:vq]=interp1([参数:v],[参数:xq]) -返回插值值,并假定默认采样点的一组坐标。 默认的点是从 1 以前 n,在哪里 n 取决于形式 [参数:v]:

    • 如果 [参数:v] -矢量,默认点的形式 1:长度(<参数:v>>);

    • 如果 [参数:v] -表单中带有默认点的数组 1:尺寸(<参数:v>>,1).

    如果您对点之间的绝对距离不感兴趣,请使用此语法。

  • [参数:vq]=interp1(<参数:v>>,<参数:xq>>,<参数:方法>>) -定义任何替代插值方法,并使用默认采样点。

  • [参数:vq]=interp1(<参数:v>>,<参数:xq>>,<参数:方法>>,<参数:外推>>) -定义外推策略并使用默认采样点。

争论

输入参数

# x — 样本点

+ 向量资料

Details

指定为实数的行向量或列向量的采样点。 价值 x 他们一定是不同的。 长度 x 必须满足以下要求之一:

  • 如果 [参数:v] -矢量,然后 长度(x) 必须等于 长度(<参数:v>>);

  • 如果 [参数:v] -一个数组,然后 长度(x) 必须等于 尺寸(<参数:v>>,1).

数据类型

漂浮物32, 漂浮64</无翻译>

# v — 样本值

+ 向量资料 | 矩阵 | 阵列

Details

指定为实数或复数的向量、矩阵或数组的样本值。 如果 v -矩阵或数组,则每列包含一组单独的一维值。

如果 v 包含复数,则函数 interp1 分别内插实部和虚部。

数据类型

漂浮物32, 漂浮64</无翻译> 支持复数::是

# xq — 查询点

+ 标量,标量 | 向量资料 | 矩阵 | 阵列

Details

查询点指定为标量、向量、矩阵或实数数组。

数据类型

漂浮物32, 漂浮64</无翻译>

# 方法 — 插值方法

+ "线性" (默认情况下)| "最近" | "下一个" | "上一篇" | "pchip" | "立方" | "v5cubic" | "牧马" | "样条"

Details

指定为此表中的选项之一的插值方法。

方法 资料描述 连续性 评论

"线性"

线性插值。 查询点处的内插值基于在每个相应维度中的相邻网格点处的值的线性内插。 这是默认的插值方法。

*需要至少2个点 * 它比最近邻插值需要更多的内存和计算时间。

"最近"

最近邻插值。 查询点处的插值值是采样网格中最近点处的值。

间歇性

*需要至少2个点 * 低内存要求 * 最快的计算时间

"下一个"

插值到下一个邻居。 查询点处的插值值是选择网格中下一个点处的值。

间歇性

*需要至少2个点 * 与…​…​相同的内存需求和计算时间 "最近"

"上一篇"

前邻居的插值。 查询点处的内插值是选择网格中前一点处的值。

间歇性

*需要至少2个点 * 与…​…​相同的内存需求和计算时间 "最近"

"pchip"

分段三次保形插值。 查询点处的插值值基于相邻网格点处的值的分段三次插值,同时保留形状。

*至少需要4分 * 需要更多的内存和计算时间比 "线性"

"立方"

*Engee*中使用的三次卷积。

*至少需要3分 * 点应均匀分布 * 对于分布不均匀的数据,该方法使用插值。 "样条" * 内存要求和计算时间相似 "pchip"

"v5cubic"

同为 "立方".

"牧马"

Akim的修正插值由三次埃尔米特多项式。 查询点处的内插值基于程度不高于第三的多项式的分段线性函数。 Akim的公式已被修改,以防止排放。

*需要至少2个点 * 产生的起伏少于 "样条" 但它并没有像以前那样积极地顺利进行 "pchip" * 计算需要的资源比 "pchip",但通常小于 "样条" * 内存要求类似 "样条"

"样条"

使用"not-a-knot"条件的样条插值。 查询点处的内插值基于每个相应维度中相邻网格点处的值的三次内插。

*至少需要4个点,如果有2个或3个点,则分别应用线性或二次插值。 * 它需要更多的内存和计算时间比 "pchip"

# 外推法 — 外推策略

+ "额外" | 标量,标量

Details

外推策略,定义为 "额外" 或真正的标量值。

  • 指定 "额外" 如果你想让函数 interp1 使用与用于插值相同的方法计算定义区域之外的点。

  • 如果要函数指定标量值 interp1 为定义区域之外的点返回某个常量值。

默认行为取决于输入参数:

  • 如果指定了插值方法 "pchip", "样条""牧马",默认行为为 — "额外".

  • 所有其他插值方法默认返回 于定义区域之外的查询点。

数据类型

查尔, 字符串, 漂浮物32, 漂浮64</无翻译>

输出参数

# vq — 插值值

+ 标量,标量 | 向量资料 | 矩阵 | 阵列

Details

作为标量、矢量、矩阵或数组返回的插值值。 大小 vq的 取决于形式 [参数:v][参数:xq].

表格 v 表格 xq系列 大小 vq的 例子:

向量资料

向量资料

尺寸(xq)

如果 尺寸(v)=[1100]尺寸(xq)=[1500] 然后 尺寸(vq)=[1500].

向量资料

矩阵或N维数组

尺寸(xq)

如果 尺寸(v)=[1100]尺寸(xq)=[5030] 然后 尺寸(vq)=[5030].

矩阵或N维数组

向量资料

[长度(xq)尺寸(v,2),…​,尺寸(v,n)]

如果 尺寸(v)=[1003]尺寸(xq)=[1500] 然后 尺寸(vq)=[5003].

矩阵或N维数组

矩阵或N维数组

[尺寸(xq,1),…​,尺寸(xq,n),…​尺寸(v,2),…​,尺寸(v,m)]

如果 尺寸(v)=[456]尺寸(xq)=[237] 然后 尺寸(vq)=[23756].

例子:

近似采样的正弦函数的插值

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")

interp1 1

现在让我们评估一下 v 在相同的点上,使用该方法 "样条".

vq2 = interp1(x, v, xq, "spline")

plot(xq, vq2, linestyle = :dot)
scatter!(x, v,
         markershape = :circle,
         xlims = (0, 2π),
         title = "Spline Interpolation")

interp1 2

不指定点的插值

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")

interp1 3

复杂值的插值

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)

interp1 4

使用两种不同方法进行外推

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, v2v3.

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))

interp1 5

图上的圆圈表示 v,而实线表示 vq的.

此外

Akim和样条插值

Details

Akim’s algorithm for one-dimensional interpolation,described in[1]and[2],执行三次插值以获得具有连续一阶导数的分段多项式( ). 该算法保留了坡度,避免了平坦区域的起伏。 当算法用直线连接三个或更多连续共线点时,就会出现平坦部分。 要确保两个数据点之间的区域是平坦的,请在它们之间插入一个额外的数据点。

当两个具有不同斜率的平坦区域相交时,对Akim原始算法的修改为斜率更接近于零的一侧赋予了更多权重。 这种修改优先考虑更接近水平的一侧,这更直观,避免了超调。 (Akim的原始算法为两侧的点赋予相等的权重,从而均匀分布起伏。)

另一方面,*样条算法*执行三次插值以获得具有连续二阶导数的分段多项式( 结果与常规多项式插值相当,但较不易受数据点之间的强烈波动的影响。 然而,这种方法可能受到数据点之间的异常值和波动的影响。

与样条算法相比,Akim算法产生的类似波浪的振荡更少,更适合处理平坦区域之间的快速变化。

文学作品

  1. Akima,Hiroshi。 "一种基于局部程序的插值和平滑曲线拟合的新方法。"ACM(JACM)_,17.4,1970,第589-602页

  2. Akima,Hiroshi。 "一种基于局部程序的双变量插值和平滑曲面拟合方法。"COMMUNICATIONS OF THE ACM,17.1,1974,pp.18-20.