主要内容

插值网格数据

网格化数据由形成网格的规则间隔点上的值或测量值组成。网格数据出现在许多领域,如气象学、测量学和医学成像。在这些领域,通常以有规律的空间间隔进行测量,可能是随着时间的推移。这些有序的数据网格的范围可以从1-D(用于简单的时间序列)到4-D(用于测量随时间变化的体积)或更高。网格化数据的一些例子是:

  • 1-D:股票价格随时间的变化

  • 二维:表面的温度

  • 三维:大脑的核磁共振成像图像

  • 4-D:海洋在一段时间内的体积水的测量

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

MATLAB网格插值函数

MATLAB®提供了一些基于网格的插值工具:

网格创建函数

meshgrid而且ndgrid函数创建不同维度的网格。meshgrid可以创建2-D或3-D网格,而ndgrid可以创建具有任意数量维度的网格。这些函数使用不同的输出格式返回网格。控件可以在这些网格格式之间进行转换pagetransposeR2020b)或交换函数来交换网格的前两个维度。

插值函数

插值函数函数族包括interp1,interp2,interp3,interpn.每个函数都被设计成用特定数量的维来插值数据。interp2而且interp3使用网格meshgrid格式,而interpn中使用网格ndgrid格式。

插值的对象

griddedInterpolant对象支持在任意维金宝app度上对数据进行插值ndgrid格式。这些对象还支持多值插值(金宝appR2021a生效),其中每个格点可以有多个与之相关的值。

使用它可以带来内存和性能方面的好处griddedInterpolant对象插值函数功能。griddedInterpolant为插值对象的重复查询提供了实质性的性能改进,而插值函数函数每次被调用时执行一个新的计算。同时,griddedInterpolant以内存效率高的格式存储样本点紧凑的网格),它是多线程的,以利用多核计算机处理器的优势。

网格表示

MATLAB允许您以三种表示方式之一表示网格:完整网格、紧凑网格或默认网格。默认网格和紧凑网格分别主要用于方便和提高效率。

完整的网格

一个完整的网格是所有点都明确定义的。的输出ndgrid而且meshgrid定义一个完整的网格。您可以创建完整的网格统一的,其中每个维度上的点间距相等,或非均匀,其中间距在一个或多个维度上变化。均匀网格可以在每个维度上有不同的间距,只要每个维度内的间距是恒定的。

统一的 统一的 非均匀

每个方向上点间距均匀的网格。

网格点间距均匀,但每个维度的间距不同。

每个维度上的点间距不等的网格。

一个统一的完整网格的例子是:

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

紧凑的网格

在处理大型网格时,显式地定义网格中的每个点会消耗大量内存。的紧凑的网格表示是一种免除完整网格内存开销的方法。紧凑的网格表示只存储网格向量(每个维度一个)而不是整个网格。这些网格向量一起隐式地定义了网格。事实上,输入meshgrid而且ndgrid是网格向量,这些函数复制网格向量以形成完整的网格。紧凑的网格表示使您能够绕过网格创建,并直接向插值函数提供网格向量。

例如,考虑两个向量,X1 = 1:3而且X2 = 1:5.你可以把这些向量看成是坐标系中的一组坐标x1方向和一组坐标在x2方向,像这样:

一个网格向量水平排列,另一个垂直排列。

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

一个网格向量水平排列,另一个垂直排列,向量中的点定义了一个点的网格。

你的输入网格向量可能是单调非单调.单调向量包含在该维度上增加或减少的值。相反,非单调向量包含波动的值。如果输入网格向量是非单调的,例如[2 4 6 3 1],然后[X1,X2] = ndgrid([2 4 6 3 1])输出一个非单调网格。如果您打算将网格传递给其他MATLAB函数,则网格向量应该是单调的。的排序函数有助于保证单调性。

默认的网格

在一些应用程序中,只有格点上的值是重要的,而格点之间的距离并不重要。例如,大多数核磁共振扫描收集的数据在各个方向上都是均匀间隔的。在这种情况下,您可以允许插值函数自动生成一个默认的网格与数据一起使用的表示。为此,省略插值函数的网格输入。当您省略网格输入时,该函数自动认为数据位于单位间距的网格上。函数在执行时创建这个单位间距的网格,省去了自己创建网格的麻烦。

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

考虑以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 0 0 5 5 5 5 10 10 10 10 10 15 15 15 15 20 20 20 20 20 20

(x,y)的坐标表示为中对应的元素X而且Y矩阵。第一个格点由(X (1) (1)),即[0 0],下一个网格点由[X Y (2) (2)],即[0 5]等等。

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

T = [1 1 10 1 1 1;1 10 10 10 10;100 100 1000 100 100;10 10 10 10 1;1 1 10 1 1];冲浪(X, Y, T)视图(2)

网格温度数据的表面图。

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

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

[Xq,Yq] = meshgrid(0:0.5:20);Tq = interp2(X,Y,T,Xq,Yq);冲浪(Xq Yq Tq)视图(2)

内插温度数据的表面图。

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

网格插值方法

MATLAB中基于网格的插值函数和对象提供了几种不同的插值方法。在选择插值方法时,请记住,有些方法比其他方法需要更多的内存或更长的计算时间。您可能需要权衡这些资源,以获得所需的平滑结果。下表给出了应用于相同1-D数据的每种插值方法的预览,还提供了每种方法的优点、权衡和要求的概述。

方法 描述

最近邻插值。

查询点上的插值值是最近的样本网格点上的值。

  • 不连续

  • 适度的内存需求

  • 最快计算时间

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

下一个邻居插值。

查询点的内插值是下一个样本网格点的值。

  • 不连续

  • 与最近邻相同的内存需求和计算时间

  • 仅适用于1-D插值

  • 至少需要2个网格点

以前的邻居插值。

查询点上的插值值是前一个样例网格点上的值。

  • 不连续

  • 与最近邻相同的内存需求和计算时间

  • 仅适用于1-D插值

  • 至少需要2个网格点

线性插值。

查询点上的插值值基于每个维度上相邻网格点上的值的线性插值。

  • C0连续

  • 需要比最近邻居更多的内存和计算时间

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

分段三次插值。

查询点上的插值值基于相邻网格点上的值的形状保持分段三次插值。

  • C1连续

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

  • 仅适用于1-D插值

  • 至少需要4个网格点

立方插值。

查询点上的插值值基于每个维度上相邻网格点上的值的三次插值。

  • C1连续

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

  • 网格必须有均匀的间距,尽管每个维度的间距不必相同

  • 每个维度至少需要4个点

改进的Akima插值。

在查询点上的插值值基于一个分段多项式函数,该函数的阶数最多为3,使用每个各自维度中相邻网格点的值进行评估。的对Akima公式进行了修正避免过度。

  • C1连续

  • 与样条相似的内存需求

  • 需要比三次曲线更多的计算时间,但通常少于样条曲线

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

样条插值。

查询点上的插值值基于每个维度中相邻网格点上的值的三次插值。

  • C2连续的

  • 需要比立方更多的内存和计算时间

  • 每个维度至少需要4个点

另请参阅

||||

相关的话题