主要内容

插值分散的数据

分散的数据

分散的数据由一组点X和相应的值V,点没有结构或秩序之间的相对位置。有很多种插值方法分散数据。一种广泛使用的方法使用一个德劳内三角的点。

这个例子展示了如何构建一个插值表面呈三角形点和提高级的顶点V维正交X

如何运用这种方法上有差异。在这个例子中,插值是分解成单独的步骤;通常情况下,整个插补过程是一个函数调用来完成。

创建一个分散的数据集表面上的抛物面。

X = [-1.5 - 3.2;1.8 - 3.3;-3.7 - 1.5;-1.5 - 1.3;0.8 - 1.2;3.3 - 1.5;-4.0 - -1.0;-2.3 - -0.7;0 -0.5;2.0 - -1.5;3.7 - -0.8;-3.5 - -2.9;-0.9 - -3.9;2.0 - -3.5;3.5 - -2.25);V = X (: 1)。^ 2 + X (:, 2) ^ 2;持有plot3 (X (: 1) X(:, 2), 0(15日1),“* r”)轴([4、4、4、4、0、25));网格stem3 (X (: 1), (:, 2), V,“^”,“填满”)举行视图(322.5,30);

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。

创建一个德劳内三角、解除顶点和评估interpolant查询Xq

图(“颜色”,“白色”)t =德劳内(X (: 1), (2):,);持有trimesh (t) X (: 1), X(:, 2), 0(15日1),“EdgeColor”,“r”,“FaceColor”,“没有”)defaultFaceColor = (0.6875 0.8750 0.8984);trisurf (t) X (: 1), X (:, 2), V,“FaceColor”,defaultFaceColor,“FaceAlpha”,0.9);plot3 (X (: 1) X(:, 2), 0(15日1),“* r”)轴([4、4、4、4、0、25));网格plot3 (-2.6, -2.6, 0,‘* b”,“线宽”,1.6)plot3 ([-2.6 - -2.6], [-2.6 - -2.6], [0 13.52]”,“- b”,“线宽”,1.6)视图(322.5,30);文本(-2.0,-2.6,Xq的,“FontWeight”,“大胆”,“HorizontalAlignment”,“中心”,“写成BackgroundColor”,“没有”);

图包含一个坐标轴对象。坐标轴对象包含6块类型的对象,线,文本。

这一步通常涉及到三角的遍历数据结构找到包含查询点的三角形。一旦你找到这一点,后续步骤计算值取决于插值法。你可以计算在附近最近的点和使用价值(最近邻插值方法)。你也可以计算的值的加权和封闭的三角形的三个顶点(线性插值方法)。这些方法及其变体都包含在文本散乱数据插值和引用。

虽然说明强调二维插值,可以将这种技术应用到更高的维度。在更一般的条件,给定一组点X和相应的值V,您可以构建一个interpolant的形式V = F (X)。你可以在一个查询评估interpolant点Xq,给Vq = F (Xq)。这是一个单值函数;任何查询点Xq凸壳内X,它会产生一种独特的价值矢量量化。假定样本数据尊重这个属性,以产生一个令人满意的插值。

MATLAB®提供了两种方法来执行triangulation-based分散数据插值:

griddata支持二维散射数据插金宝app值函数。的griddatan在一天支持散乱数据金宝app插值函数;然而,它不是实际尺寸高于6 d中度到大点集,由于指数增长所需的内存中潜在的三角测量。

scatteredInterpolant类支持在2 金宝appd和3 d空间散乱数据插值。使用这个类是鼓励更高效和容易适应更广泛的插值问题。

插值使用griddata和griddatan分散数据

griddatagriddatan函数的采样点集,X相应的值,V和查询点,Xq,并返回插值,矢量量化。每个函数调用语法相似;主要的区别是2 d / 3 dgriddata函数允许您定义的点X,Y/X,Y,Z坐标。这两个函数插入分散数据在预定义的网格点的位置;目的是生成网格数据,因此这个名字。插值是在实践中更普遍。您可能想要查询内的任意位置上的点的凸包。

这个例子显示了如何griddata函数篡改分散数据的一组网格点和使用这个网格数据创建一个等高线图。

画出海底山数据集(一个海底山是一个水下山)。数据集由一组经度(x)和纬度(y)位置,和相应的海底山海拔高度(z在这些坐标测量。

负载海底山plot3 (x, y, z,“。”,“markersize”(12)包含“经”)ylabel (“纬度”)zlabel (“深度尺”网格)

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象。

使用meshgrid创建一组二维网格点在longitude-latitude平面,然后使用griddata在这些点插入相应的深度。

图(xi, yi) = meshgrid (210.8:0.01:211.8 -48.5:0.01: -47.9);子= griddata (x, y, z,ξ,易);冲浪(xi,咦,zi);包含(“经”)ylabel (“纬度”)zlabel (“深度尺”)

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的表面。

现在数据网格格式,计算和绘制轮廓。

图(c、h) =轮廓(xi,咦,zi);clabel (c、h);包含(“经”)ylabel (“纬度”)

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象轮廓。

您还可以使用griddata在任意位置插入数据集的凸包。例如,深度坐标(211.3,-48.2)是由:

子= griddata (x, y, z, 211.3, -48.2);

底层的三角计算每次griddata函数被调用。这会影响性能相同的数据集是否插入多次与不同的查询点。的scatteredInterpolant类中描述插值使用scatteredInterpolant分散数据类在这方面更加有效。

MATLAB软件还提供了griddatan支持在金宝app高维插值。类似于调用语法griddata

scatteredInterpolant类

griddata函数是非常有用的,当你需要插入的值在一组预定义的网格点的位置。在实践中,往往是更一般的插值问题,scatteredInterpolant类提供了更大的灵活性。类具有以下优点:

  • 它产生一个可以查询有效的插值函数。一旦创建,底层的三角和重用为后续查询。

  • 独立于三角插值方法可以改变。

  • 数据点的值可以改变三角的独立。

  • 数据点可以逐步添加到现有interpolant没有触发一个完整的重新计算。有效数据点也可以删除和移动,提供点编辑很小的数量相对于采样点的总数。

  • 它提供了在点逼近值外推功能,在凸包外。看到推断分散的数据为更多的信息。

scatteredInterpolant提供了以下插值方法:

  • “最近的”——近邻插值,插值表面不连续的地方。

  • “线性”——线性插值(默认),C0连续插值曲面。

  • “天然”——Natural-neighbor插值插值曲面的C1连续除了在采样点。

scatteredInterpolant类支持在2 金宝appd和3 d空间散乱数据插值。您可以创建interpolant通过调用scatteredInterpolant通过点位置和相应的值,可以选择内插和外推方法。看到scatteredInterpolant参考页面关于语法的更多信息你可以使用它来创建和评估scatteredInterpolant

插值使用scatteredInterpolant分散数据类

这个例子展示了如何使用scatteredInterpolant插入一个分散的抽样山峰函数。

创建一个分散的数据集。

rng默认的;X = 3 + 6。*兰德(250 [2]);V =山峰(X (: 1), (2):,);

创建interpolant。

F = scatteredInterpolant (X, V)
F = scatteredInterpolant属性:点:[250 x2双]价值观:[250 x1双]方法:“线性”ExtrapolationMethod:“线性”

属性代表了数据点的坐标,属性代表相关的值。的方法产权代表的插值方法进行插值。的ExtrapolationMethod属性代表了外推方法时使用查询点超出凸包。

您可以访问的属性F以同样的方式你访问的字段结构体。例如,使用F.Points检查数据点的坐标。

评估interpolant。

scatteredInterpolant提供了interpolant下标的评价。它是评价一个函数一样。你可以评估interpolant如下。在这种情况下,价值是由查询位置矢量量化。你可以在一个查询评估:

Vq = F ([1.5 - 1.25])
Vq = 1.4838

你也可以通过个人坐标:

Vq = F (1.5, 1.25)
Vq = 1.4838

你可以在一个向量的点位置:评估

Xq = [0.5 - 0.25;0.75 - 0.35;1.25 - 0.85);Vq = F (Xq)
Vq =3×10.4057 1.2199 2.1639

你可以评估F在网格点的位置和策划的结果。

[Xq, Yq] = meshgrid (-2.5:0.125:2.5);Vq = F (Xq, Yq);冲浪(Xq Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”);zlabel (“价值——V”,“fontweight”,“b”);标题(的线性插值方法,“fontweight”,“b”);

图包含一个坐标轴对象。坐标轴对象与标题线性插值方法包含一个类型的对象的表面。

改变插值法。

你可以改变动态插值法。设置的方法“最近的”

F.Method=“最近的”;

重新评估和情节interpolant之前。

Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”)zlabel (“价值——V”,“fontweight”,“b”)标题(“最近邻插值法”,“fontweight”,“b”);

图包含一个坐标轴对象。坐标轴对象与标题最近邻插值方法包含一个对象类型的表面。

改变插值法自然的邻居,重新评估,绘制结果。

F.Method=“天然”;Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”)zlabel (“价值——V”,“fontweight”,“b”)标题(“自然相邻插值法”,“fontweight”,“b”);

图包含一个坐标轴对象。坐标轴对象与标题自然相邻插值方法包含一个类型的对象的表面。

替换值的示例数据的位置。

可以更改的值V在样本数据的位置,X在飞。这是有用的在实践中一些插值问题可能有多个组值在同一位置。例如,假设您想插入一个定义的三维速度场的位置(x,y,z和相应的组件化的速度矢量Vx,v,Vz)。您可以插入每个速度分量的分配他们的值属性(V)。这有重要的性能好处,因为它允许您重用相同的interpolant不引起的开销计算每次一个新的。

以下步骤展示了如何改变我们的示例中的值。你会使用表达式计算的值, v = x e - - - - - - x 2 - - - - - - y 2

V = X (: 1)。* exp (- X (: 1)。^ 2 X (:, 2) ^ 2);F.Values=V;

评估interpolant和策划的结果。

Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”)zlabel (“价值——V”,“fontweight”,“b”)标题(“自然相邻插值v = x。* exp (- x ^ 2 y ^ 2)。”)

图包含一个坐标轴对象。坐标轴对象标题N t u r l空白N e i g h b o r i N t e r p o l t i o N空白o f空白v =空白x。* e p (x - x。基线- y的平方。²基线)包含一个类型的对象的表面。

添加额外的现有interpolant点位置和价值观。

这个执行有效的更新,而不是一个完整的重新计算使用增强的数据集。

当添加示例数据,重要的是添加点位置和相应的值。

继续这个示例,创建新的采样点如下:

X = -1.5 + 3。*兰德(100 2);V = X (: 1)。* exp (- X (: 1)。^ 2 X (:, 2) ^ 2);

添加新的点和三角测量相应的值。

F.Points (+ (1:10 0):) = X;F.Values(结束+ (1:10 0))= V;

评估精制interpolant和阴谋的结果。

Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”);zlabel (“价值——V”,“fontweight”,“b”);

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的表面。

从interpolant删除数据。

你可以从interpolant逐步消除样本数据点。你也可以删除interpolant数据点和相应的值。这是用于消除虚假的离群值。

消除样本数据时,重要的是删除点位置和相应的值。

删除25点。

:F.Points(25日)= [];F.Values (25) = [];

删除5到15点。

F.Points (: 5:15) = [];F.Values (5:15) = [];

保留和删除其余的150点。

F.Points(150:最终,)= [];F.Values(150年底):= [];

这将创建一个粗糙表面,当你评估和情节:

Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”);zlabel (“价值——V”,“fontweight”,“b”);标题(v = x的插值。* exp (- x ^ 2 y ^ 2)采样点删除的)

图包含一个坐标轴对象。坐标轴对象标题l I n t e r p o t I o n空白o f空白v =空白x。* e p (x - x。基线- y的平方。平方基线)空白w t h空白s m p l e空白p i n t s空白r e m o阿v e d包含一个类型的对象的表面。

复杂的分散数据的插值

这个例子展示了如何插入分散数据值在每个样本位置时的复杂。

创建示例数据。

rng (“默认”)X = 3 + 6 *兰德(250 [2]);V =复杂(X (: 1)。* X (:, 2), X (: 1)。^ 2 + X (:, 2) ^ 2);

创建interpolant。

F = scatteredInterpolant (X, V);

创建一个网格查询点和评估interpolant网格点。

[Xq, Yq] = meshgrid (-2.5:0.125:2.5);Vq = F (Xq, Yq);

情节真实的组成部分矢量量化

VqReal =实际(Vq);图冲浪(Xq, Yq VqReal);包含(“X”);ylabel (“Y”);zlabel (“实际价值- V”);标题(“插入值实部”);

图包含一个坐标轴对象。坐标轴对象与标题的组件插入值包含一个类型的对象的表面。

情节的虚构的成分矢量量化

VqImag =图像放大(Vq);图冲浪(Xq, Yq VqImag);包含(“X”);ylabel (“Y”);zlabel (“虚构的价值——V”);标题(“插入值的虚拟组件”);

图包含一个坐标轴对象。插值的坐标轴对象与标题的组件包含一个类型的对象的表面价值。

解决散乱数据插值问题

许多说明性的例子在前面的部分处理的点集插值采样在光滑的表面上。此外,相对均匀间隔的。例如,集群的点没有相对较大的距离。此外,interpolant评估好凸壳内的点的位置。

在处理现实世界的数据插值问题可能更具挑战性。它可能来自测量设备,可能会产生不准确的读数或离群值。底层数据相差顺利,可能会突然从点对点的值。本节提供了一些指导方针,识别和解决散乱数据插值问题。

输入数据包含nan

你应该进行预处理,其中包含示例数据值删除值作为该数据不能导致插值。如果一个删除,相应的数据值/坐标也应该删除,以确保一致性。如果值存在于样本数据,构造函数调用时将错误。

下面的例子说明了如何删除年代。

创建一些数据和一些条目替换:

1 x =兰特(25日)* 4 - 2;1)y =兰德(25日* 4 - 2;V = x。^ 2 + y ^ 2;x(5) =南;x(10) =南;y(12) =南;V(14) =南;
这段代码的错误:
F = scatteredInterpolant (x, y, V);
相反,找到的样本点指数然后构造interpolant:
nan_flags = isnan (x) | isnan (y) | isnan (V);x (nan_flags) = [];y (nan_flags) = [];V (nan_flags) = [];F = scatteredInterpolant (x, y, V);
下面的例子是类似如果点位置矩阵形式。首先,创建数据和一些条目替换值。
2 X =兰特(25日)* 4 - 2;V = X (: 1)。^ 2 + X (:, 2) ^ 2;X(1) =南;1)X(10日=南;2)X(12日=南;V(14) =南;
这段代码的错误:
F = scatteredInterpolant (X, V);
找到样本点南,然后构造interpolant指数:
nan_flags = isnan (X (: 1)) | isnan (X (:, 2)) | isnan (V);X (nan_flags:) = [];V (nan_flags) = [];F = scatteredInterpolant (X, V);

南Interpolant输出值

griddatagriddatan返回值,当你查询点凸包外使用“线性”“天然”方法。然而,你可以预期数值结果如果你查询使用相同的点“最近的”方法。这是因为最近邻查询点存在内部和外部的凸包。

如果你想计算近似值外凸包,您应该使用scatteredInterpolant。看到推断分散的数据为更多的信息。

处理重复点位置

输入数据很少是“完美”和您的应用程序可以处理重复的数据点的位置。两个或两个以上的数据点在相同的位置在你的数据集可以有不同的相应值。在这个场景中,scatteredInterpolant合并的点和计算相应的值的平均值。这个例子显示了如何scatteredInterpolant一个数据集上执行一个插值与重复的点。

  1. 创建一些示例数据,位于一个平面的表面:

    x =兰德(100 1)* 6;y =兰德(100 1)* 6;V = x + y;

  2. 介绍一个重复的点位置的分配50点到100点的坐标:

    (50)= x (100);(50)= y (100);

  3. 创建interpolant。请注意,F包含99个独特的数据点:

    F = scatteredInterpolant (x, y, V)

  4. 检查与之关联的值50点:

    F.Values (50)

这个值是最初的50和100的平均价值,这两个数据点有相同的位置:

(V (50) + V (100)) / 2
在这个场景中,interpolant以合理的方式解决了歧义。然而在某些情况下,数据点可以关闭而不是重合,在这些位置的值可以是不同的。

在一些插值问题,多组样本值可能对应于相同的位置。例如,一组值可能被记录在同一地区在不同时期的时间。为了提高效率,您可以插入一组数据,然后替换的值插入下一集。

总是使用一致的数据管理当替换值的存在重复的点位置。假设你有两套值与100年的数据点的位置和你想插入每组依次通过替换值。

  1. 考虑两种价值观:

    V1 = x + 4 * y;V2 = 3 * x + 5 * y

  2. 创建interpolant。scatteredInterpolant合并重复的地点和interpolant包含99个独特的采样点:

    F = scatteredInterpolant (x, y, V1)
    直接通过替换值F.Values=V2意味着分配100值99个样本。以前的合并操作的上下文丢失;样品位置的数量将不匹配样本值的数量。interpolant需要解决的矛盾来支持查询。金宝app

在这个更复杂的场景中,有必要删除副本创建和编辑interpolant之前。使用独特的找到独特的点的指数函数。独特的也可以输出参数的识别指标重复的点。

(~,~)=独特([x y],“第一次”,“行”);我=(我);x = x(我);y = y(我);V1 =(我);V2 = V2 (I);F = scatteredInterpolant (x, y, V1)
现在你可以使用F插入第一个数据集。然后你可以替换的值插入第二个数据集。
F.Values=V2;

当编辑scatteredInterpolant实现效率

scatteredInterpolant允许您编辑代表样本的属性值(F.Values)和插值法(F.Method)。因为这些属性是独立于底层的三角,编辑可以有效地执行。然而,像处理一个大数组,您应该注意不要不小心创建不必要的副本在编辑数据。副本是当多个变量引用一个数组,这个数组然后编辑。

不是一个副本在以下几点:

A1 =魔法(4)A1 (4, 4) = 11
然而,一份是在这种情况下,因为数组引用的另一个变量。数组A1A2再也不能共享相同的数据一旦编辑:
A1 =魔法(4)A2 = A1 A1 (4, 4) = 32
类似地,如果你将数组传递给一个函数和编辑函数的数组中,深拷贝可以根据数据管理。scatteredInterpolant包含数据,它像一个数组,用MATLAB语言,它被称为一个值对象。MATLAB语言是设计给最佳性能时应用程序划分为各个功能驻留在文件。原型在命令行可能不会产生相同级别的性能。

下面的例子演示了这种行为,但应该注意的是,性能提升在这个例子不推广到其他在MATLAB函数。

这段代码不会产生最佳性能:

x =兰德(1000000,1)* 4 - 2;y =兰德(1000000,1)* 4 - 2;z = x。* exp (- x ^ 2 y ^ 2);抽搐;F = scatteredInterpolant (x, y, z);toc抽搐;F.Values=2*z; toc
您可以将一个函数中的代码文件更有效地执行它。

MATLAB时执行一个程序,由驻留在文件的函数,它有一个完整的执行代码;这允许MATLAB优化性能。当您在命令行中输入代码,MATLAB不能预测接下来你要类型,所以它不能执行相同级别的优化。开发应用程序通过创建可重用的功能一般推荐的做法,在此设置和MATLAB优化性能。

可怜的凸壳附近的插值结果

德劳内三角测量是适合分散数据插值问题因为它有良好的几何属性,产生好结果。这些属性是:

  • 拒绝sliver-shaped三角形/四面体equilateral-shaped的人多。

  • 空外接圆属性隐式地定义了一个近邻的点之间的关系。

空外接圆属性保证了插值采样点的值是影响社区查询的位置。尽管有这些品质,在某些情况下,数据点的分布可能导致糟糕的结果,这通常发生在样本数据集的凸包,当插值产生意想不到的结果,一个阴谋的样本数据和底层三角通常可以提供洞察这个问题。

这个例子显示了一个恶化的插值结果在边界附近。

创建一个示例数据集,将展示问题在边界附近。

t = 0.4 *π:0.02:0.6 *π;x1 = cos (t) ';日元=罪(t)的-1.02;x1, x2 =y2 = y₁* (1);x3 = linspace (-0.3, 0.3, 16) ';y3 = 0(16日1);x = (x1, x2, x3);y = (y1, y2; y3);

现在取消这些采样点到表面上 z = x 2 + y 2 并插入表面。

z = x。^ 2 + y ^ 2;F = scatteredInterpolant (x, y, z);[xi, yi] = meshgrid (-0.3: .02:0.3, -0.0688:0.01:0.0688);子= F (xi, yi);网格(xi,咦,zi)包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”)zlabel (“价值——V”,“fontweight”,“b”)标题(插值结果的);

图包含一个坐标轴对象。坐标轴对象与标题插入表面包含一个类型的对象的表面。

实际的表面:

子= xi。^ 2 +易。^ 2;图网(xi,咦,zi)标题(实际表面的)

图包含一个坐标轴对象。坐标轴对象与标题实际表面包含一个类型的对象的表面。

要理解为什么插值曲面边界附近的恶化,看看底层三角:是有帮助的

dt = delaunayTriangulation (x, y);图绘制(x, y,“* r”)轴平等的持有triplot (dt)情节(x1, y1,“- r”)情节(x2, y2,“- r”)标题(“三角用来创建Interpolant”)举行

图包含一个坐标轴对象。坐标轴对象与标题三角用来创建Interpolant包含4线类型的对象。

红色边界内的三角形形状相对较好;他们是由点附近,这个地区的插值效果很好。红色外边界,三角形sliver-like和连接分彼此远离。没有足够的抽样准确地捕捉到表面,所以毫不奇怪,结果这些地区很穷。在3 d视觉检查三角变得有点棘手,但看着点分布常常可以帮助说明潜在的问题。

MATLAB®4griddata方法,v4的,不是triangulation-based和不受恶化的影响边界附近的插值曲面。

[xi, yi] = meshgrid (-0.3: .02:0.3, -0.0688:0.01:0.0688);子= griddata (x, y, z, xi,咦,v4的);网格(xi,咦,zi)包含(“X”,“fontweight”,“b”),ylabel (“Y”,“fontweight”,“b”)zlabel (“价值——V”,“fontweight”,“b”)标题(的插值结果griddata v4方法”,“fontweight”,“b”);

图包含一个坐标轴对象。坐标轴对象与标题插值结果与v4 griddata方法包含一个对象类型的表面。

的插值结果griddata使用v4的方法对应于预期的实际表面。