网格数据插值
全页展开
说明
使用 griddedInterpolant
对一维、二维、三维或 N 维网格数据集进行插值。griddedInterpolant
返回给定数据集的插值 F
。您可以计算一组查询点(例如二维 (xq,yq)
)处的 F
值,以得出插入的值 vq = F(xq,yq)
。
使用 scatteredInterpolant 执行散点数据插值。
创建对象
语法
F = griddedInterpolant
F = griddedInterpolant(x,v)
F = griddedInterpolant(X1,X2,...,Xn,V)
F = griddedInterpolant(V)
F = griddedInterpolant(gridVecs,V)
F = griddedInterpolant(___,Method)
F = griddedInterpolant(___,Method,ExtrapolationMethod)
描述
创建一个空的网格数据插值对象。F
= griddedInterpolant
示例
根据样本点向量 F
= griddedInterpolant(x,v)x
和对应的值 v
创建一维插值。
示例
使用作为一组 F
= griddedInterpolant(X1,X2,...,Xn,V)n
维数组 X1,X2,...,Xn
传递的样本点的完整网格创建二维、三维或 N 维插值。V
数组包含与 X1,X2,...,Xn
中的点位置关联的样本值。每个数组 X1,X2,...,Xn
的大小都必须与 V
相同。
示例
使用默认网格创建插值。使用此语法时,F
= griddedInterpolant(V)griddedInterpolant
将网格定义为第 i
维上间距为 1
且范围为 [1
, size(V,i)
] 的点集。如果您希望节省内存且不在意点之间的绝对距离,则可使用此语法。
示例
指定一个元胞数组 F
= griddedInterpolant(gridVecs,V)gridVecs
,它包含 n
个网格向量,描述一个 n
维样本点网格。在您要使用特定网格而且希望节省内存时可使用此语法。
示例
指定插值方法:F
= griddedInterpolant(___,Method)'linear'
、'nearest'
、'next'
、'previous'
、'pchip'
、'cubic'
、'makima'
或 'spline'
。您可以在上述任意语法中指定 Method
作为最后一个输入参量。
示例
指定内插和外插方法。当您的查询点位于样本点域之外时,F
= griddedInterpolant(___,Method,ExtrapolationMethod)griddedInterpolant
使用 ExtrapolationMethod
估计值。
输入参量
全部展开
x
— 样本点
向量
样本点,指定为向量。x
和 v
的大小必须相同。x
中的样本点必须唯一。
数据类型: single
| double
v
— 样本值
向量 | 矩阵 | 多维数组
样本值,指定为向量、矩阵或多维数组。v
的元素是对应于 x
中的样本点的值。
要使用一组值进行插值,则
x
和v
必须为相同长度的向量。要使用多组值进行插值,则
v
可以是与x
相比具有额外维度的数组。v
的第一个维度的大小必须与x
中的采样点数相匹配,并且v
中的每列都定义一组单独的一维值。例如,如果x
是一个包含 10 个元素的列向量,则可以将v
指定为 10×4 矩阵以使用四组不同值进行插值。
数据类型: single
| double
X1
, X2
, Xn
— 完整网格形式的样本点
数组
完整网格形式的样本点,指定为单独的 n
维数组。样本点必须唯一且有序。您可以使用 ndgrid 函数创建数组 X1,X2,...,Xn
。这些数组的大小相同,且每个数组的大小与 V
相同。
数据类型: single
| double
gridVecs
— 网格向量形式的样本点
网格向量元胞数组
网格向量形式的样本点,指定为网格向量元胞数组 {xg1,xg2,...,xgn}
。样本点必须唯一且有序。这些向量必须指定大小与 V
相同的网格。换言之,size(V) = [length(xg1) length(xg2),...,length(xgn)]
。将此形式用作完整网络的替代方法以在您的网格非常大时节省内存。
数据类型: single
| double
V
— 样本值
数组
样本值,指定为数组。V
的元素是对应于样本点的值。V
的前 N
个维度必须与采样点的完整网格中的对应维度具有相同的大小,其中 N
是网格的维数。
要使用一组值进行插值,请将
V
指定为数组,其大小与采样点的完整网格相同。例如,如果采样点形成一个大小为 100×100 的网格,则可以用相同大小的矩阵来指定值。要使用多组值进行插值,请将
V
指定为与采样点网格相比具有额外维度的数组。额外维度在每个采样点上定义多个值。例如,如果采样点形成一个大小为 100×100 的网格,则可以将值指定为一个 100×100×4 数组,以使用四组不同的 100×100 值进行插值。
数据类型: single
| double
Method
— 插值方法
'linear'
(默认) | 'nearest'
| 'next'
| 'previous'
| 'pchip'
| 'cubic'
| 'spline'
| 'makima'
插值方法,指定为下表中的选项之一。
方法 | 描述 | 连续性 | 注释 |
---|---|---|---|
'linear' (默认值) | 线性插值。查询点处的插入值基于各维中邻近网格点处数值的线性插值。 | C0 |
|
'nearest' | 最近邻点插值。查询点处的插入值是距样本网格点最近的值。 | 不连续 |
|
'next' | 下一个邻点插值(仅限于一维)。查询点处的插入值是下一个采样网格点的值。 | 不连续 |
|
'previous' | 上一个邻点插值(仅限于一维)。查询点处的插入值是上一个采样网格点的值。 | 不连续 |
|
'pchip' | 保形分段三次插值(仅限一维)。查询点处的插入值基于邻近网格点处数值的保形分段三次插值。 | C1 |
|
'cubic' | 三次插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。 | C1 |
|
'makima' | 修正 Akima 三次 Hermite 插值。查询点的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式。 | C1 |
|
'spline' | 三次样条插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非节点终止条件的三次样条。 | C2 |
|
ExtrapolationMethod
— 外插方法
'linear'
(默认) | 'nearest'
| 'next'
| 'previous'
| 'pchip'
| 'cubic'
| 'spline'
| 'makima'
| 'none'
外插方法,指定为 'linear'
、'nearest'
、'next'
、'previous'
、'pchip'
、'cubic'
、'spline'
或 'makima'
。另外,如果您希望网格域之外的查询返回 NaN
值,可以指定 'none'
。
如果您省略 ExtrapolationMethod
,则默认值是为 Method 指定的值。如果您同时省略 Method
和 ExtrapolationMethod
参量,则两个值均默认为 'linear'
。
属性
全部展开
GridVectors
— 网格向量
元胞数组
网格向量,指定为元胞数组 {xg1,xg2,...,xgn}
。这些向量为 Values
中的值指定网格点(位置)。网格点必须唯一。
数据类型: cell
Values
— 样本点处的函数值
数组
样本点处的函数值,指定为与 GridVectors
中的网格点关联的值数组。
数据类型: single
| double
Method
— 插值方法
'linear'
(默认) | 'nearest'
| 'next'
| 'previous'
| 'pchip'
| 'cubic'
| 'spline'
| 'makima'
内插方法,指定为字符向量。Method
可以是:'linear'
、'nearest'
、'next'
、'previous'
、'pchip'
、'cubic'
、'spline'
或 'makima'
。有关这些方法的说明,请参阅 Method。
数据类型: char
ExtrapolationMethod
— 外插方法
'linear'
| 'nearest'
| 'next'
| 'previous'
| 'pchip'
| 'cubic'
| 'spline'
| 'makima'
| 'none'
外插方法,指定为字符向量。ExtrapolationMethod
可以是:'linear'
、'nearest'
、'next'
、'previous'
、'pchip'
、'cubic'
、'spline'
、'makima'
或 'none'
。'none'
的值指示禁用外插。默认值是 Method 的值。
数据类型: char
用途
语法
Vq = F(Xq)
Vq = F(xq1,xq2,...,xqn)
Vq = F(Xq1,Xq2,...,Xqn)
Vq = F({xgq1,xgq2,...,xgqn})
描述
使用 griddedInterpolant
创建插值 F
。然后,您可以使用以下任何语法在特定查询点处计算 F
:
Vq = F(Xq)
在矩阵 Xq
中指定查询点。Xq
的每一行包含一个查询点的坐标。
Vq = F(xq1,xq2,...,xqn)
以列向量的形式指定查询点 xq1,xq2,...,xqn
,列向量的长度为 m
,表示分散在 n
维空间的 m
个点。
Vq = F(Xq1,Xq2,...,Xqn)
使用 n
维数组 Xq1,Xq2,...,Xqn
指定查询点,这些数组定义点的完整网格。
Vq = F({xgq1,xgq2,...,xgqn})
将查询点指定为网格向量。使用此语法可在您要查询大型点网格时节省内存。
示例
全部折叠
一维插值
打开实时脚本
使用 griddedInterpolant
进行一维数据集插值。
创建一个由散点样本点组成的向量 v
。这些点是在 0 到 20 之间的随机一维位置进行采样的点。
x = sort(20*rand(100,1));v = besselj(0,x);
为数据创建网格插值对象。默认情况下,griddedInterpolant
使用 'linear'
插值方法。
F = griddedInterpolant(x,v)
F = griddedInterpolant with properties: GridVectors: {[100x1 double]} Values: [100x1 double] Method: 'linear' ExtrapolationMethod: 'linear'
查询 0 到 20 之间 500 个均匀间隔点处的插值 F
。将插值结果 (xq,vq)
绘制在原始数据 (x,v)
之上。
xq = linspace(0,20,500);vq = F(xq);plot(x,v,'ro')hold onplot(xq,vq,'.')legend('Sample Points','Interpolated Values')
比较使用完整网格和网格向量的三维插值
打开实时脚本
使用这两种方法对三维数据插值以指定查询点。
创建并绘制一个三维数据集,表示函数 在 [-5,5] 范围内的一组网格样本点处计算的结果。
[x,y] = ndgrid(-5:0.8:5);z = sin(x.^2 + y.^2) ./ (x.^2 + y.^2);surf(x,y,z)
为数据创建网格插值对象。
F = griddedInterpolant(x,y,z);
使用更精细的网格查询插值并提高分辨率。
[xq,yq] = ndgrid(-5:0.1:5);vq = F(xq,yq);surf(xq,yq,vq)
如果存在大量样本点或查询点,或者担心内存使用量太大,您可以使用网格向量来提高内存使用率。
如果您指定网格向量而不是使用
ndgrid
来创建完整网格,则griddedInterpolant
可以避免为执行计算而生成完整的查询网格。传递网格向量时,它们通常一组为单位,就像元胞数组
{xg1, xg2, ..., xgn}
中的元胞一样。网格向量是表示完整网格数据点的紧凑方式。
也可以使用网格向量执行上述命令。
x = -5:0.8:5;y = x';z = sin(x.^2 + y.^2) ./ (x.^2 + y.^2);F = griddedInterpolant({x,y},z);xq = -5:0.1:5;yq = xq';vq = F({xq,yq});surf(xq,yq,vq)
使用默认网格进行插值
打开实时脚本
使用默认网格对一组样本点执行快速插值。默认网格使用单一间距点,因此当样本点之间的精确 xy 间距不重要时,可以使用这种插值方法。
创建一个样本函数值矩阵,然后绘制它们对默认网格的图。
x = (1:0.3:5)';y = x';V = cos(x) .* sin(y);n = length(x);surf(1:n,1:n,V)
使用默认网格插人数据。
F = griddedInterpolant(V)
F = griddedInterpolant with properties: GridVectors: {[1 2 3 4 5 6 7 8 9 10 11 12 13 14] [1 2 3 4 5 6 7 8 9 10 11 12 13 14]} Values: [14x14 double] Method: 'linear' ExtrapolationMethod: 'linear'
查询插值并绘制结果。
[xq,yq] = ndgrid(1:0.2:n);Vq = F(xq,yq);surf(xq',yq',Vq)
更精细的网格上的二维插值
打开实时脚本
使用间距为 0.5
的完整网格进行粗略取样的数据插值。
在两个维度中以完整网格形式定义范围为 [1, 10] 的样本点。
[X,Y] = ndgrid(1:10,1:10);
在网格点处对 进行采样。
V = X.^2 + Y.^2;
创建指定三次插值的插值。
F = griddedInterpolant(X,Y,V,'cubic');
使用 0.5
间距定义由查询点构成的完整网格并在这些点计算插值。然后,绘制结果。
[Xq,Yq] = ndgrid(1:0.5:10,1:0.5:10);Vq = F(Xq,Yq);mesh(Xq,Yq,Vq);
一维外插
打开实时脚本
使用 'pchip'
和 'nearest'
外插方法比较查询 F
的域外插值的结果。
创建插值,并指定 'pchip'
作为内插方法,'nearest'
作为外插方法。
x = [1 2 3 4 5];v = [12 16 31 10 6];F = griddedInterpolant(x,v,'pchip','nearest')
F = griddedInterpolant with properties: GridVectors: {[1 2 3 4 5]} Values: [12 16 31 10 6] Method: 'pchip' ExtrapolationMethod: 'nearest'
查询插值,并包括 F
的域外部的点。
xq = 0:0.1:6;vq = F(xq);figureplot(x,v,'o',xq,vq,'-b');legend ('v','vq')
再次查询相同点的插值,这次使用 'pchip'
外插方法。
F.ExtrapolationMethod = 'pchip';figurevq = F(xq);plot(x,v,'o',xq,vq,'-b');legend ('v','vq')
在同一网格上进行多组值插值
打开实时脚本
使用 griddedInterpolant
在相同的查询点上进行三组不同值插值。
使用 和 创建一个采样点网格。
gx = -5:5;gy = -3:3;[X,Y] = ndgrid(gx,gy);
在查询点计算三个不同函数的值,然后将这些值串联成一个三维数组。V
的大小与前两个维度中的 X
和 Y
网格相同,但额外维度的大小反映与每个采样点相关联的值数目(在本例中为三个)。
f1 = X.^2 + Y.^2;f2 = X.^3 + Y.^3;f3 = X.^4 + Y.^4;V = cat(3,f1,f2,f3);
使用采样点和相关联的值创建插值。
F = griddedInterpolant(X,Y,V);
创建一个查询点网格,其网格大小比采样点更细。
qx = -5:0.4:5;qy = -3:0.4:3;[XQ,YQ] = ndgrid(qx,qy);
在查询点对所有三组值进行插值。
VQ = F(XQ,YQ);
将原始数据与插值后的结果进行比较。
tiledlayout(3,2)nexttilesurf(X,Y,f1)title('f1')nexttilesurf(XQ,YQ,VQ(:,:,1))title('Interpolated f1')nexttilesurf(X,Y,f2)title('f2')nexttilesurf(XQ,YQ,VQ(:,:,2))title('Interpolated f2')nexttilesurf(X,Y,f3)title('f3')nexttilesurf(XQ,YQ,VQ(:,:,3))title('Interpolated f3')
详细信息
全部展开
插值
可在查询点计算的插值函数。
网格数据
一组轴对齐的有序点。
散点数据
在其相对位置没有结构体的一组点。
完整网格
表示为一组数组的网格。例如,您可以使用 ndgrid 创建完整网格。
网格向量
充当 ndgrid
格式的网格的紧凑表示形式的向量组。
例如,[X,Y] = ndgrid(xg,yg)
在矩阵 X
和 Y
中返回完整网格。您可以使用网格向量 xg
和 yg
表示同一网格。
提示
计算一个
griddedInterpolant
对象F
在多组不同查询点处的插值比分别使用interp1
、interp2
、interp3
或interpn
计算插值更快。例如:% Fast to create interpolant F and evaluate multiple timesF = griddedInterpolant(X1,X2,V)v1 = F(Xq1)v2 = F(Xq2)% Slower to compute interpolations separately using interp2v1 = interp2(X1,X2,V,Xq1)v2 = interp2(X1,X2,V,Xq2)
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
查询点的维度和输入网格数据的维度必须为编译时常量。
Method
和ExtrapolationMethod
必须为常量(生成代码时的已知值)。代码生成不支持用于二维、三维或 N 维插值的 makima 函数。
代码生成不支持空插值对象。
如果
griddedInterpolant
的Values
属性是可变大小,不是可变长度向量,并且在运行时变为行向量,则会发生错误。如果采样值或查询点包含
Inf
或-Inf
,则生成的代码的输出可能与 MATLAB® 中的输出不匹配。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
对于一维插值,支持的插值方法有
'cubic'
、'linear'
、'nearest'
、'next'
、'previous'
和'spline'
。对于二维插值,支持的插值方法有
'cubic'
、'linear'
和'nearest'
。对于三维和更高维插值,支持的插值方法有
'linear'
和'nearest'
。不支持六维或更高维插值。
当采样值参量
V
包含NaN
值时,不支持插值方法'spline'
。仅当使用
'spline'
内插方法时,才支持外插方法'spline'
。仅当使用
'cubic'
或'spline'
内插方法时,才支持外插方法'cubic'
。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2011b 中推出
全部展开
R2021a: 同时对多个数据集进行插值
增加了在同一网格上的相同查询点处对多个数据集进行插值的支持。例如,如果指定一个二维网格、一个由网格点处的值组成三维数组,以及一个二维查询点集合,则 griddedInterpolant
将为三维值数组中每个二维页返回查询点处的插值。
以前,此功能可在 interp1
中用于一维插值,但对 griddedInterpolant
的这一改进增加了对 N 维多值插值的支持。
另请参阅
scatteredInterpolant | interp1 | interp2 | interp3 | interpn | ndgrid | meshgrid | fillmissing | filloutliers
主题
- 使用网格插值对图像重采样
- 网格数据插值
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:
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)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 简体中文
- English
- 日本 (日本語)
- 한국 (한국어)
Contact your local office