Main Content

网格数据插值

网格数据由形成网格的等间距点上的值或测量值组成。网格数据应用于许多领域,如气象学、测绘学和医学成像。在这些领域,经常以固定空间间隔取测量值,且可能随时间进行测量。这些有序的数据网格的范围可以从一维(对于简单时间序列)到四维(对于随时间变化的三维体测量)或更高维。网格数据的一些示例有:

  • 一维:随时间变化的股票价格

  • 二维:曲面的温度

  • 三维:大脑的 MRI 图像

  • 四维:随时间变化的海洋水体测量值

在所有这些应用中,基于网格的插值可高效地将数据扩充到未进行测量的点。例如,如果您有某股票的小时价格数据,可以使用插值来逼近每 15 分钟的价格。

MATLAB 网格插值函数

MATLAB® 提供几种用于基于网格插值的工具:

网格创建函数

meshgridndgrid 函数创建各种维度的网格。meshgrid 可以创建二维或三维网格,而 ndgrid 可以创建任意维数的网格。这些函数使用不同输出格式返回网格。您可以使用 pagetranspose从 R2020b 开始)或 permute 函数在这些网格格式之间进行转换,以交换网格的前两个维度。

插值函数:

interp 系列函数包括 interp1interp2interp3interpn。每个函数都设计用于对具有特定维数的数据进行插值。interp2interp3 使用 meshgrid 格式的网格,而 interpn 使用 ndgrid 格式的网格。

插值对象

griddedInterpolant 对象支持对 ndgrid 格式的数据进行任意维数的插值。这些对象还支持多值插值(从 R2021a 开始),其中每个网格点可以有多个关联的值。

与使用 interp 函数相比,使用 griddedInterpolant 对象具有内存和性能优势。griddedInterpolant 为插值对象的重复查询提供了显著的性能改进,而 interp 函数在每次调用时都会执行新计算。此外,griddedInterpolant 以内存高效格式存储采样点(作为简洁网格),并以多线程方式利用多核计算机处理器。

网格表示法

MATLAB 允许按以下三种方式之一表示网格:完整网格、简洁网格或默认网格。默认网格和简洁网格主要是分别为了方便使用和提高效率。

完整网格

完整网格是一种以显式方式定义所有点的网格。ndgridmeshgrid 的输出定义一个完整网格。您可以创建均匀的完整网格,其中每个维度中的点具有相等的间距,或创建非均匀的完整网格,其中一个或多个维度的间距不同。均匀网格在不同维度上可以有不同间距,但每个维度内的间距是固定的。

均匀均匀非均匀

Grid with uniformly-spaced points in each direction.

Grid with uniformly-spaced points, but the spacing differs in each dimension.

Grid with nonuniformly-spaced points in each dimension.

均匀完整网格的示例如下:

[X,Y] = meshgrid([1 2 3],[3 6 9 12])
X =

     1     2     3
     1     2     3
     1     2     3
     1     2     3


Y =

     3     3     3
     6     6     6
     9     9     9
    12    12    12

简洁网格

在处理大型网格时,显式定义网格中的每个点会消耗大量内存。简洁网格表示法无需完整网格的内存使用量。简洁网格表示法只存储网格向量(每个维度对应一个),而不存储整个网格。各网格向量共同隐式定义了网格。事实上,meshgridndgrid 的输入是网格向量,这些函数复制网格向量以形成完整网格。简洁网格表示法使您能够绕过网格创建,并将网格向量直接提供给插值函数。

例如,假设有两个向量,x1 = 1:3x2 = 1:5。可以将这些向量视为沿 x1 方向的一组坐标和沿 x2 方向的一组坐标,如下所示:

One grid vector is arranged horizontally and the other vertically.

每个箭头指向一个位置。使用这两个向量可以定义一组网格点,其中一组坐标由 x1 给定,另一组坐标由 x2 给定。在复制网格向量时,它们构成了组成完整网格的两个坐标数组:

With one grid vector arranged horizontally and the other vertically, the points in the vectors define a grid of points.

您的输入网格向量可能是单调非单调的。单调向量所含的值在该维中递增,或在该维中递减。反之,非单调向量含有的值会上下波动。如果输入网格向量是非单调的,如 [2 4 6 3 1],则 [X1,X2] = ndgrid([2 4 6 3 1]) 输出非单调网格。如果要将网格传递给其他 MATLAB 函数,网格向量应当是单调的。sort 函数可用于确保单调性。

默认网格

在某些应用中,只有网格点的值才是重要的,而网格点之间的距离并不重要。例如,大多数 MRI 扫描收集的数据在所有方向上都是等间距的。在这种情况下,您可以允许插值函数自动生成默认网格表示来处理数据。为此,无需提供插值函数的网格输入。当您不提供网格输入时,该函数会自动将数据视为位于单位间距的网格上。该函数在执行时创建此单位间距的网格,省去您自己创建网格的麻烦。

示例:二维网格上的温度插值

假设在一个曲面上以 5 厘米固定间隔收集温度数据,在每个方向上延伸 20 厘米。使用 meshgrid 创建完整网格。

[X,Y] = meshgrid(0:5:20)
X =

     0     5    10    15    20
     0     5    10    15    20
     0     5    10    15    20
     0     5    10    15    20
     0     5    10    15    20


Y =

     0     0     0     0     0
     5     5     5     5     5
    10    10    10    10    10
    15    15    15    15    15
    20    20    20    20    20

每个网格点的坐标 (x,y) 表示为 XY 矩阵中的对应元素。第一个网格点由 [X(1) Y(1)] 给出,即 [0 0],下一个网格点由 [X(2) Y(2)] 给出,即 [0 5],依此类推。

现在,创建一个矩阵来表示网格上的温度测量值,然后将数据绘制为曲面。

T = [1   1   10   1   1; 
     1   10  10   10  10;  
     100 100 1000 100 100; 
     10  10  10   10  1;
     1   1   10   1   1];
surf(X,Y,T)
view(2)

Surface plot of gridded temperature data.

虽然中心网格点的温度很高,但从原始数据来看,其位置和对周围网格点的影响并不明显。

要将数据分辨率提高 10 倍,请使用 interp2 将温度数据插值到使用 0.5 厘米间隔的更精细的网格上。再次使用 meshgrid 创建由矩阵 XqYq 表示的更精细的网格。然后,将 interp2 与原始网格、温度数据和新网格点结合使用,绘制生成的数据。默认情况下,interp2 在每个维度中使用线性插值。

[Xq,Yq] = meshgrid(0:0.5:20);
Tq = interp2(X,Y,T,Xq,Yq);
surf(Xq,Yq,Tq)
view(2)

Surface plot of interpolated temperature data.

对温度数据进行插值可以增加图像的细节,并大大提高测量区域内数据的有用性。

网格插值方法

MATLAB 中基于网格的插值函数和对象提供几种不同插值方法。在选择插值方法时,切记有些方法比其他方法需要更多的内存或更长的计算时间。您需要权衡这些资源,以实现结果所需要的平滑度。下表给出了应用于同一一维数据的每种插值方法的预览,并概述了每种方法的优点、取舍和要求。

方法描述

Nearest neighbor interpolation.

查询点处的插入值是距采样网格点最近的值。

  • 不连续

  • 最低内存要求

  • 最快计算时间

  • 每个维度需要 2 个网格点。

Next neighbor interpolation.

查询点处的插入值是下一个采样网格点的值。

  • 不连续

  • 其内存要求和计算时间与最近邻点法相同。

  • 仅适用于一维插值

  • 需要至少 2 个网格点。

Previous neighbor interpolation.

查询点处的插入值是上一个采样网格点的值。

  • 不连续

  • 其内存要求和计算时间与最近邻点法相同。

  • 仅适用于一维插值

  • 需要至少 2 个网格点。

Linear interpolation.

查询点处的插入值基于各维中邻近网格点处数值的线性插值。

  • C0 连续

  • 比最近邻点插值需要更多内存和计算时间。

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

Piece-wise cubic interpolation.

查询点处的插入值基于邻近网格点处数值的保形分段三次插值。

  • C1 连续

  • 比线性插值需要更多内存和计算时间

  • 仅适用于一维插值

  • 需要至少 4 个网格点。

Cubic interpolation.

查询点处的插入值基于各维中邻近网格点处数值的三次插值。

  • C1 连续

  • 比线性插值需要更多内存和计算时间

  • 网格必须有均匀间距,但是每维中的间距不必相同。

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

Modified Akima interpolation.

查询点处的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式

  • C1 连续

  • 与样条插值具有相似的内存要求。

  • 比三次插值需要更长的计算时间,但通常少于样条插值的计算时间。

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

Spline interpolation.

查询点处的插入值基于各维中邻点网格点处数值的三次插值。

  • C2 连续

  • 比三次插值需要更多内存和计算时间

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

另请参阅

| | | |

相关主题