# interp3
meshgrid 格式的三维网格数据的插值
函数库: TyMath
# 语法
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq)
Vq = interp3(V,Xq,Yq,Zq)
Vq = interp3(V)
Vq = interp3(V,k)
Vq = interp3(___,method)
Vq = interp3(___,method,extrapval)
# 说明
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq) 使用线性插值返回三变量函数在特定查询点的插值。结果始终穿过函数的原始采样。X、Y 和 Z 包含样本点的坐标。V 包含各样本点处的对应函数值。Xq、Yq 和 Zq 包含查询点的坐标。示例
Vq = interp3(V,Xq,Yq,Zq) 假定一个默认的样本点网格。默认网格点覆盖区域 X=1:n、Y=1:m 和 Z=1:p,其中 m,n,p = size(V)。如果您希望节省内存且不在意点之间的绝对距离,则可使用此语法。
Vq = interp3(V) 将每个维度上样本值之间的间隔分割一次,形成细化网格,并基于该网格上返回插入值。
Vq = interp3(V,k) 将每个维度上样本值之间的间隔反复分割 k 次,形成细化网格,并基于该网格上返回插入值。这将在样本值之间生成 2^k-1 个插值点。
Vq = interp3(___,method) 指定备选插值方法:"linear"、"nearest"、"cubic"、"makima" 或 "spline"。默认方法为 "linear"。示例
Vq = interp3(___,method,extrapval) 还指定标量值或字符串 extrapval,如果此参数为标量值,则会为处于样本点域范围外的所有查询点赋予该标量值,否则则使用字符串指定的外插方法。示例
如果您为样本点域范围外的查询省略 extrapval 参数,则基于 method 参数,interp3 返回下列值之一:
"cubic",返回 NaN 值;
对于其他内插方法,返回将正常计算得到结果。
# 示例
使用默认方法进行插值
加载 flow 函数的点和值,每个维度采样 10 个点。
using TyMath
using TyBase
using TyPlot
X,Y,Z,V = TyPlot.flow(10;nargout=4)
flow 函数通过数组 X、Y 和 Z 返回网格。该网格覆盖区域 0.1≤X≤10、−3≤Y≤3、−3≤Z≤3,间距为 ΔX=0.5、ΔY=0.7 和 ΔZ=0.7。
创建间距为 0.25 的查询网格。
Xq,Yq,Zq = meshgrid3(.1:.25:10,-3:.25:3,-3:.25:3)
对查询网格中的点插值。
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq)
使用三次插值方法进行插值
加载 flow 函数的点和值,每个维度采样 10 个点。
using TyMath
using TyBase
using TyPlot
X, Y, Z, V = TyPlot.flow(10;nargout=4)
flow 函数通过数组 X、Y 和 Z 返回网格。该网格覆盖区域 0.1≤X≤10、−3≤Y≤3、−3≤Z≤3,间距为 ΔX=0.5、ΔY=0.7 和 ΔZ=0.7。
创建间距为 0.25 的查询网格。
Xq,Yq,Zq = meshgrid3(.1:.25:10,-3:.25:3,-3:.25:3)
使用 "cubic" 插值方法在查询网格点处插值。
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq,"cubic")
在 X,Y 和 Z 域范围外执行计算
创建网格向量 x、y 和 z。这些向量用于定义与 V 中的值相关联的点。
using TyMath
x = 1:100
y = 1:50
z = 1:30
将样本值定义为一个 50×100×30 的随机数数组 V。使用 rand 函数创建数组。
rng = MersenneTwister(1234)
V = rand(rng, 50,100,30)
计算 x、y 和 z 域范围外三个点处的 V。指定 extrapval = -1。
xq = [0 0 0]
yq = [0 0 51]
zq = [0 101 102]
vq = interp3(x,y,z,V,xq,yq,zq,"linear",-1)
vq = 1×3 Matrix{Float64}:
-1.0 -1.0 -1.0
三个点计算得到的值均为 -1,因为它们位于 x、y 和 z 域之外。
# 输入参数
X,Y,Z - 样本网格点数组 | 向量
样本网格点,指定为实数数组或向量。样本网格点必须是唯一的。
如果 X、Y 和 Z 是数组,则包含完整网格(meshgrid 格式) 的坐标。使用 meshgrid3 函数同时创建 X、Y 和 Z 数组。这些数组的大小必须相同。
示例: X,Y,Z = meshgrid3(1:30,-10:10,1:5)
数据类型: Int | Float
V - 样本值数组
样本值,指定为实数或复数数组。V 的大小要求取决于 X、Y 和 Z 的大小:
如果 X、Y 和 Z 是表示完整网格(meshgrid 格式)的数组,则 V 的大小与 X、Y 或 Z 的大小匹配;
如果 X、Y 和 Z 是网格向量,则 size(V) = (length(Y),length(X), length(Z))。
如果 V 包含复数,则 interp3 将分别对实部和虚部插值。
示例: rand(10,10,10)
数据类型: Int | Float
复数支持: 是
Xq,Yq,Zq - 查询点标量 | 向量 | 数组
查询点,指定为实数标量、向量或数组。
如果 Xq、Yq 和 Zq 是标量,则为 R3中单个查询点的坐标;
如果 Xq、Yq 和 Zq 是方向不同的向量,则 Xq、Yq 和 Zq 将被视作 R3 中的网格向量;
如果 Xq、Yq 和 Zq 是大小和方向都相同的向量,则 Xq、Yq 和 Zq 将被视作 R3 中的散点;
如果 Xq、Yq 和 Zq 是大小相同的数组,则表示 R3 中由查询点构成的一个完整网格(meshgrid 格式)或多个散点。
示例: Xq,Yq,Zq = meshgrid3(1:0.1:10,-5:0.1:0,3:5)
数据类型: Int | Float
k - 细化因子1(默认)| 非负实整数标量
细化因子,指定为非负实整数标量。此值指定对每个维度上网格点之间的间隔重复分割优化的次数。这将在样本值之间生成 2^k-1 个插值点。
如果 k 为 0,则 Vq 与 V 相同。
interp3(V,1) 与 interp3(V) 相同。
下面的插图描绘了在 R3 的一个平面上,k=2 时的情形。共有 72 个插入值(以红色表示)和 9 个样本值(以黑色表示)。
示例: interp3(V,2)
数据类型: Int
method - 插值方法"linear"(默认) | "nearest" | "cubic" | "spline"
| "makima"
插值方法,指定为下表中的选项之一。
| 方法 | 说明 | 连续性 | 注释 |
|---|---|---|---|
| "linear" | 查询点处的插入值基于各维中邻近网格点处数值的线性插值。这是默认插值方法。 | C0 |
|
| "nearest" | 查询点处的插入值是距样本网格点最近的值。 | 不连续 |
|
| "cubic" | 查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。 | C1 |
|
| "makima" | 修正 Akima 三次 Hermite 插值。查询点的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式。 | C1 |
|
| "spline" | 查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非结终止条件的三次样条。 | C2 |
|
数据类型: String
extrapval - X 和 Y 域范围外的函数值字符串 | 标量
X 和 Y 域范围外的函数值,指定为实数、复数标量或字符串。如指定为标量,interp2 为 X 和 Y 域范围外的所有点返回此常量值,否则则为域外点采取以该字符串指示方法的外插值。
示例: 5
示例: 5+1im
示例: "spline"
数据类型: Int | Float | String
复数支持: 是
# 输出参数
Vq - 插入的值标量 | 向量 | 矩阵
插入的值,以实数或复数标量、向量或矩阵的形式返回。Vq 的大小和形状取决于所用的语法以及(某些情况下)输入参数的大小和值。
| 语法 | 特殊条件 | Vq 的大小 | 示例 |
|---|---|---|---|
| interp3(X,Y,Z,V,Xq,Yq,Zq) interp3(V,Xq,Yq,Zq) 以及包含 method 或 extrapval 的这些语法的变体 | Xq 、Yq 和 Zq 是标量 | 标量 | 将 Xq 、Yq 和 Zq 作为标量传递时,size(Vq) = (1,1)。 |
| 同上 | Xq 、Yq 和 Zq 是大小和方向都相同的向量 | 大小和方向与 Xq 、Yq 和 Zq 相同的向量 | 如果 size(Xq) = (100,1)、
size(Yq) = (100,1) 且 size(Zq) = (100,1), 则 size(Vq) = (100,1)。 |
| 同上 | Xq 、Yq 和 Zq 是混合方向的向量 | size(Vq) = (length(Y), length(X),
length(Z)) | 如果 size(Xq) = (100,1)、
size(Yq) = (1,50) 且 size(Zq) = (5,1), 则 size(Vq) = (50,100,5)。 |
| 同上 | Xq 、Yq 和 Zq 是大小相同的数组 | 大小与 Xq 、 Yq 和 Zq 相同的数组 | 如果 size(Xq) = (50,25)、
size(Yq) = (50,25) 且 size(Zq) = (50,25), 则 size(Vq) = (50,25)。 |
| method 以及包含 extrapval 或 interp2(V,k) 的此语法的变体 | 无 | 第 i 个维度的长度为
2^k * (size(V,i)-1)+1 的数组 | 如果 size(V) = (10,12,5)
且 k = 3, 则 size(Vq) = (73,89,33) 。 |
数据类型: Int | Float
复数支持: 是
# 详细信息
严格单调
一组始终递减或递增且无反转的值。例如,序列 a = [2 4 6 8] 便是一个严格单调递增的序列。序列 b = [2 4 4 6 8] 则非严格单调,因为 b[2] 与 b[3] 之间的值无变化。而序列 c = [2 4 6 8 6] 在 c[4] 与 c[5] 之间包含反转,因此连单调序列也不是。
完整网格(meshgrid)格式
网格向量
对 interp3 而言,网格向量由三个具有混合方向的向量组成,这些向量用来定义 R3 中的网格点。
例如,以下代码便为区域 1 ≤ x ≤ 3、4 ≤ y ≤ 5 和 6 ≤ z ≤ 8 创建了一个网格向量:
x = 1:3
y = (4:5)'
z = 6:8
散点
对 interp3 而言,散点由三个用来定义 R3 散点集合的数组或向量 Xq、Yq 和 Zq 组成。第 i 个数组包含第 i 个维度的坐标。
例如,以下代码便指定了点 (1, 19, 10)、(6, 40, 1)、(15, 33, 22) 和 (0, 61, 13)。
Xq = [1 6; 15 0]
Yq = [19 40; 33 61]
Zq = [10 1; 22 13]