interp3
meshgrid 格式的三维网格数据的插值
语法
说明
示例
使用默认方法进行插值
加载 flow 函数的点和值,每个维度采样 10 个点。
[X,Y,Z,V] = flow(10);
flow
函数通过数组 X
、Y
和 Z
返回网格。该网格覆盖区域 、、,间距为 、 和 。
现在,绘制穿过以下样本体的切片:X=6
、X=9
、Y=2
和 Z=0
。
figure
slice(X,Y,Z,V,[6 9],2,0);
shading flat
创建间距为 0.25 的查询网格。
[Xq,Yq,Zq] = meshgrid(.1:.25:10,-3:.25:3,-3:.25:3);
对查询网格中的点插值,并使用相同的切片平面绘制结果。
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq);
figure
slice(Xq,Yq,Zq,Vq,[6 9],2,0);
shading flat
使用三次插值方法进行插值
加载 flow 函数的点和值,每个维度采样 10 个点。
[X,Y,Z,V] = flow(10);
flow
函数通过数组 X
、Y
和 Z
返回网格。该网格覆盖区域 、、,间距为 、 和 。
绘制穿过以下样本体的切片:X=6
、X=9
、Y=2
和 Z =0
。
figure
slice(X,Y,Z,V,[6 9],2,0);
shading flat
创建间距为 0.25 的查询网格。
[Xq,Yq,Zq] = meshgrid(.1:.25:10,-3:.25:3,-3:.25:3);
使用 'cubic'
插值方法在查询网格点处插值。然后,绘制结果。
Vq = interp3(X,Y,Z,V,Xq,Yq,Zq,'cubic'); figure slice(Xq,Yq,Zq,Vq,[6 9],2,0); shading flat
在 X、Y 和 Z 域范围外执行计算
创建网格向量 x
、y
和 z
。这些向量用于定义与 V
中的值相关联的点。
x = 1:100; y = (1:50)'; z = 1:30;
将样本值定义为一个 50×100×30 的随机数数组 V
。使用 rand
函数创建数组。
rng('default')
V = rand(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
-1 -1 -1
三个点计算得到的值均为 -1
,因为它们位于 x
、y
和 z
域之外。
输入参数
X,Y,Z
— 样本网格点
数组 | 向量
样本网格点,指定为实数数组或向量。样本网格点必须是唯一的。
如果
X
、Y
和Z
是数组,则包含完整网格(meshgrid 格式)的坐标。使用meshgrid
函数同时创建X
、Y
和Z
数组。这些数组的大小必须相同。
示例: [X,Y,Z] = meshgrid(1:30,-10:10,1:5)
数据类型: single
| double
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)
数据类型: single
| double
复数支持: 是
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] = meshgrid((1:0.1:10),(-5:0.1:0),3:5)
数据类型: single
| double
k
— 细化因子
1
(默认) | 非负实整数标量
细化因子,指定为非负实整数标量。此值指定对每个维度上网格点之间的间隔重复分割优化的次数。这将在样本值之间生成 2^k-1
个插值点。
如果 k
为 0
,则 Vq
与 V
相同。
interp3(V,1)
与 interp3(V)
相同。
下面的插图描绘了在 R3 的一个平面上,k=2
时的情形。共有 72 个插入值(以红色表示)和 9 个样本值(以黑色表示)。
示例: interp3(V,2)
数据类型: single
| double
method
— 插值方法
'linear'
(默认) | 'nearest'
| 'cubic'
| 'spline'
| 'makima'
插值方法,指定为下表中的选项之一。
方法 | 描述 | 连续性 | 注释 |
---|---|---|---|
'linear' | 查询点处的插入值基于各维中邻近网格点处数值的线性插值。这是默认插值方法。 | C0 |
|
'nearest' | 查询点处的插入值是距样本网格点最近的值。 | 不连续 |
|
'cubic' | 查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。 | C1 |
|
'makima' | 修正 Akima 三次 Hermite 插值。查询点的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式。 | C1 |
|
'spline' | 查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非节点终止条件的三次样条。 | C2 |
|
extrapval
— X
、Y
和 Z
域范围外的函数值
标量
X
、Y
和 Z
域范围外的函数值,指定为实数或复数标量。interp3
为 X
、Y
和 Z
域范围外的所有点返回此常量值。
示例: 5
示例: 5+1i
数据类型: single
| double
复数支持: 是
输出参数
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) = [1 100] 、size(Yq) = [50 1] 且 size(Zq) = [1 5] ,则 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 或 interp3(V,k) 的此语法的变体 | 无 | 第 | 如果 size(V) = [10 12 5] 且 k = 3 ,则 size(Vq) = [73 89 33] 。 |
详细信息
严格单调
一组始终递减或递增且无反转的值。例如,序列 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];
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
Xq
、Yq
和Zq
的大小必须相同。使用meshgrid
进行网格计算。为了获得最佳结果,请以向量的形式提供
X
、Y
和Z
。这些向量的值必须严格单调递增。代码生成不支持
'makima'
插值方法。对于
'cubic'
插值方法,如果网格没有均匀间距,将会出现错误。这种情况下,请使用'spline'
插值方法。使用
'spline'
插值方法时,为了获得最佳结果,请:使用
meshgrid
创建输入Xq
、Yq
和Zq
。使用小于
V
维度数的插值点数。对大量散点进行插值可能效率不高。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
V
必须是双精度或单精度三维数组。V
可以是实数或复数。X
、Y
和Z
必须:具有相同的类型(双精度或单精度)。
是在对应维度具有递增和非重复元素的有限向量或三维数组。
当
X
、Y
和Z
是三维数组时与笛卡尔坐标区对齐(就像它们是由meshgrid
生成的一样)。维度与
V
一致。
Xq
、Yq
和Zq
必须是具有相同类型的向量或数组(双精度或单精度)。如果Xq
、Yq
和Zq
为数组,则它们必须具有相同大小。如果它们是具有不同长度的向量,则其中一个必须具有不同的方向。method
必须是'linear'
或'nearest'
。不支持超出边界输入的外插。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)