网格数据插值 - MATLAB - MathWorks 中国 (2024)

Table of Contents
说明 创建对象 语法 描述 输入参量 x — 样本点向量 v — 样本值 向量 | 矩阵 | 多维数组 X1, X2, Xn — 完整网格形式的样本点 数组 gridVecs — 网格向量形式的样本点 网格向量元胞数组 V — 样本值 数组 Method — 插值方法 'linear' (默认) | 'nearest' | 'next' | 'previous' | 'pchip' | 'cubic' | 'spline' | 'makima' ExtrapolationMethod — 外插方法 'linear' (默认) | 'nearest' | 'next' | 'previous' | 'pchip' | 'cubic' | 'spline' | 'makima' | 'none' 属性 GridVectors — 网格向量 元胞数组 Values — 样本点处的函数值 数组 Method — 插值方法 'linear' (默认) | 'nearest' | 'next' | 'previous' | 'pchip' | 'cubic' | 'spline' | 'makima' ExtrapolationMethod — 外插方法 'linear' | 'nearest' | 'next' | 'previous' | 'pchip' | 'cubic' | 'spline' | 'makima' | 'none' 用途 语法 描述 示例 一维插值 比较使用完整网格和网格向量的三维插值 使用默认网格进行插值 更精细的网格上的二维插值 一维外插 在同一网格上进行多组值插值 详细信息 插值 网格数据 散点数据 完整网格 网格向量 提示 扩展功能 C/C++ 代码生成 使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。 基于线程的环境 使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。 GPU 数组通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。 版本历史记录 R2021a: 同时对多个数据集进行插值 另请参阅 主题 MATLAB 命令 Americas Europe Asia Pacific

网格数据插值

全页展开

说明

使用 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 估计值。

输入参量

全部展开

样本点,指定为向量。xv 的大小必须相同。x 中的样本点必须唯一。

数据类型: single | double

样本值,指定为向量、矩阵或多维数组。v 的元素是对应于 x 中的样本点的值。

  • 要使用一组值进行插值,则 xv 必须为相同长度的向量。

  • 要使用多组值进行插值,则 v 可以是与 x 相比具有额外维度的数组。v 的第一个维度的大小必须与 x 中的采样点数相匹配,并且 v 中的每列都定义一组单独的一维值。例如,如果 x 是一个包含 10 个元素的列向量,则可以将 v 指定为 10×4 矩阵以使用四组不同值进行插值。

数据类型: single | double

完整网格形式的样本点,指定为单独的 n 维数组。样本点必须唯一且有序。您可以使用 ndgrid 函数创建数组 X1,X2,...,Xn。这些数组的大小相同,且每个数组的大小与 V 相同。

数据类型: single | double

网格向量形式的样本点,指定为网格向量元胞数组 {xg1,xg2,...,xgn}。样本点必须唯一且有序。这些向量必须指定大小与 V 相同的网格。换言之,size(V) = [length(xg1) length(xg2),...,length(xgn)]。将此形式用作完整网络的替代方法以在您的网格非常大时节省内存。

数据类型: single | double

样本值,指定为数组。V 的元素是对应于样本点的值。V 的前 N 个维度必须与采样点的完整网格中的对应维度具有相同的大小,其中 N 是网格的维数。

  • 要使用一组值进行插值,请将 V 指定为数组,其大小与采样点的完整网格相同。例如,如果采样点形成一个大小为 100×100 的网格,则可以用相同大小的矩阵来指定值。

  • 要使用多组值进行插值,请将 V 指定为与采样点网格相比具有额外维度的数组。额外维度在每个采样点上定义多个值。例如,如果采样点形成一个大小为 100×100 的网格,则可以将值指定为一个 100×100×4 数组,以使用四组不同的 100×100 值进行插值。

数据类型: single | double

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

方法描述连续性注释
'linear'(默认值)线性插值。查询点处的插入值基于各维中邻近网格点处数值的线性插值。 C0
  • 每个维需要至少 2 个网格点。

  • 'nearest' 需要更多内存

'nearest'最近邻点插值。查询点处的插入值是距样本网格点最近的值。 不连续
  • 每个维度需要 2 个网格点。

  • 内存要求最低,计算速度最快

'next'下一个邻点插值(仅限于一维)。查询点处的插入值是下一个采样网格点的值。不连续
  • 需要至少 2 个点。

  • 内存要求和计算时间与 'nearest' 相同

'previous'上一个邻点插值(仅限于一维)。查询点处的插入值是上一个采样网格点的值。不连续
  • 需要至少 2 个点。

  • 内存要求和计算时间与 'nearest' 相同

'pchip'保形分段三次插值(仅限一维)。查询点处的插入值基于邻近网格点处数值的保形分段三次插值。C1
  • 需要至少 4 个点。

  • 'linear' 需要更多内存和计算时间

'cubic'三次插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。C1
  • 网格必须有均匀间距,虽然每个维度上的间距不必相同。

  • 每维需要至少 4 个网格点。

  • 'linear' 需要更多内存和计算时间

'makima'修正 Akima 三次 Hermite 插值。查询点的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式。C1
  • 每一维需要至少 2 个点。

  • 产生的波动比 'spline' 小,但不像 'pchip' 那样急剧变平

  • 计算成本高于 'pchip',但通常低于 'spline'

  • 内存要求与 'spline' 类似

'spline'三次样条插值。查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非节点终止条件的三次样条。C2
  • 每维需要 4 个网格点。

  • 'cubic' 需要更多内存和计算时间

外插方法,指定为 'linear''nearest''next''previous''pchip''cubic''spline''makima'。另外,如果您希望网格域之外的查询返回 NaN 值,可以指定 'none'

如果您省略 ExtrapolationMethod,则默认值是为 Method 指定的值。如果您同时省略 MethodExtrapolationMethod 参量,则两个值均默认为 'linear'

属性

全部展开

网格向量,指定为元胞数组 {xg1,xg2,...,xgn}。这些向量为 Values 中的值指定网格点(位置)。网格点必须唯一。

数据类型: cell

样本点处的函数值,指定为与 GridVectors 中的网格点关联的值数组。

数据类型: single | double

内插方法,指定为字符向量。Method 可以是:'linear''nearest''next''previous''pchip''cubic''spline''makima'。有关这些方法的说明,请参阅 Method

数据类型: char

外插方法,指定为字符向量。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')

网格数据插值 - MATLAB- MathWorks 中国 (1)

比较使用完整网格和网格向量的三维插值

打开实时脚本

使用这两种方法对三维数据插值以指定查询点。

创建并绘制一个三维数据集,表示函数 z(x,y)=sin(x2+y2)x2+y2 在 [-5,5] 范围内的一组网格样本点处计算的结果。

[x,y] = ndgrid(-5:0.8:5);z = sin(x.^2 + y.^2) ./ (x.^2 + y.^2);surf(x,y,z)

网格数据插值 - MATLAB- MathWorks 中国 (2)

为数据创建网格插值对象。

F = griddedInterpolant(x,y,z);

使用更精细的网格查询插值并提高分辨率。

[xq,yq] = ndgrid(-5:0.1:5);vq = F(xq,yq);surf(xq,yq,vq)

网格数据插值 - MATLAB- MathWorks 中国 (3)

如果存在大量样本点或查询点,或者担心内存使用量太大,您可以使用网格向量来提高内存使用率。

  • 如果您指定网格向量而不是使用 ndgrid 来创建完整网格,则 griddedInterpolant 可以避免为执行计算而生成完整的查询网格。

  • 传递网格向量时,它们通常一组为单位,就像元胞数组 {xg1, xg2, ..., xgn} 中的元胞一样。网格向量是表示完整网格数据点的紧凑方式。

网格数据插值 - MATLAB- MathWorks 中国 (4)

也可以使用网格向量执行上述命令。

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)

网格数据插值 - MATLAB- MathWorks 中国 (5)

使用默认网格进行插值

打开实时脚本

使用默认网格对一组样本点执行快速插值。默认网格使用单一间距点,因此当样本点之间的精确 xy 间距不重要时,可以使用这种插值方法。

创建一个样本函数值矩阵,然后绘制它们对默认网格的图。

x = (1:0.3:5)';y = x';V = cos(x) .* sin(y);n = length(x);surf(1:n,1:n,V)

网格数据插值 - MATLAB- MathWorks 中国 (6)

使用默认网格插人数据。

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)

网格数据插值 - MATLAB- MathWorks 中国 (7)

更精细的网格上的二维插值

打开实时脚本

使用间距为 0.5 的完整网格进行粗略取样的数据插值。

在两个维度中以完整网格形式定义范围为 [1, 10] 的样本点。

[X,Y] = ndgrid(1:10,1:10);

在网格点处对 f(x,y)=x2+y2 进行采样。

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

网格数据插值 - MATLAB- MathWorks 中国 (8)

一维外插

打开实时脚本

使用 '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')

网格数据插值 - MATLAB- MathWorks 中国 (9)

再次查询相同点的插值,这次使用 'pchip' 外插方法。

F.ExtrapolationMethod = 'pchip';figurevq = F(xq);plot(x,v,'o',xq,vq,'-b');legend ('v','vq')

网格数据插值 - MATLAB- MathWorks 中国 (10)

在同一网格上进行多组值插值

打开实时脚本

使用 griddedInterpolant 在相同的查询点上进行三组不同值插值。

使用 -5X5-3Y3 创建一个采样点网格。

gx = -5:5;gy = -3:3;[X,Y] = ndgrid(gx,gy);

在查询点计算三个不同函数的值,然后将这些值串联成一个三维数组。V 的大小与前两个维度中的 XY 网格相同,但额外维度的大小反映与每个采样点相关联的值数目(在本例中为三个)。

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

网格数据插值 - MATLAB- MathWorks 中国 (11)

详细信息

全部展开

可在查询点计算的插值函数。

一组轴对齐的有序点。

在其相对位置没有结构体的一组点。

表示为一组数组的网格。例如,您可以使用 ndgrid 创建完整网格。

提示

  • 计算一个 griddedInterpolant 对象 F 在多组不同查询点处的插值比分别使用 interp1interp2interp3interpn 计算插值更快。例如:

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

扩展功能

版本历史记录

在 R2011b 中推出

全部展开

另请参阅

scatteredInterpolant | interp1 | interp2 | interp3 | interpn | ndgrid | meshgrid | fillmissing | filloutliers

主题

  • 使用网格插值对图像重采样
  • 网格数据插值

MATLAB 命令

您点击的链接对应于以下 MATLAB 命令:

 

请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。

网格数据插值 - MATLAB- MathWorks 中国 (12)

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

Europe

Asia Pacific

Contact your local office

网格数据插值 - MATLAB
- MathWorks 中国 (2024)
Top Articles
Latest Posts
Article information

Author: Velia Krajcik

Last Updated:

Views: 5780

Rating: 4.3 / 5 (54 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Velia Krajcik

Birthday: 1996-07-27

Address: 520 Balistreri Mount, South Armand, OR 60528

Phone: +466880739437

Job: Future Retail Associate

Hobby: Polo, Scouting, Worldbuilding, Cosplaying, Photography, Rowing, Nordic skating

Introduction: My name is Velia Krajcik, I am a handsome, clean, lucky, gleaming, magnificent, proud, glorious person who loves writing and wants to share my knowledge and understanding with you.