插值散乱数据

分散的数据

分散的数据由一组点组成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),X(:,2),V,“^”,'填')举行视图(322.5,30);

创建一个Delaunay三角,解除顶点,并在查询点评估插值XQ

图('颜色',“白色”) t = delaunay(X(:,1),X(:,2));持有trimesh(T,X(:,1),X(:,2),零(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”,“大胆”,'水平对齐','中央','背景颜色',“没有”);

此步骤一般包括遍历所述三角数据结构找到包围查询点的三角形。一旦你找到了点,后来的步骤来计算的价值取决于插值方法。你可以计算在附近的最近点,并在该点(最近邻插值法)使用的值。你也可以计算包围三角形的三个顶点的值的加权和(线性内插法)。这些方法及其变体都覆盖在散乱数据插值文本和引用。

虽然插图强调了二维插值,但您可以将此技术应用于更高维度。在更一般的情况下,给定一组点X和对应的值V,你可以构造形式的插值V = F (X)。您可以在查询点评估插值XQ,给Vq = F (Xq)。这是一个单值函数;对于任何查询点XQ的凸包内X,它会产生一个独特的价值VQ。假设样本数据尊重这一性质,以产生一个满意的插值。

MATLAB®提供两种方法来执行基于三角的分散数据插值:

griddata函数支持二维离散数万博1manbetx据插值。的griddatan功能支持散乱数据插万博1manbetx值在N- d;然而,这不是在对中度到大的点集,大于6-d更高维度实用由于由基础三角测量需要在存储器中的指数增长。

scatteredInterpolant类支持散乱数万博1manbetx据插值在2- d和3-d的空间。这个类的使用鼓励,因为它是更有效和更容易适应更宽范围的内插的问题。

插值散乱数据使用的GridData和griddatan

griddatagriddatan函数采用一个采样点集合,X相应的值,V和查询点,XQ,并返回内插值,VQ。每个函数的调用语法都是相似的;主要的区别是2-D / 3-Dgriddata函数让您定义的点X,Y/X,Y,Z坐标。这两个函数内插在预定的网格点位置散射的数据;意图是产生网格数据,因此而得名。插值是在实践中更普遍。您可能需要在点的凸包内的任意位置进行查询。

这个例子展示了如何griddata函数在一组网格点上插值散乱的数据,并使用此网格数据创建等高线图。

绘出海底山数据集(一个海底山是一个水下山脉)。该数据集包括一组经度的(x)及纬度(y)位置,并相应海底山海拔高度(z)在这些坐标下测量的。

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

使用meshgrid在经纬度平面,然后使用创建一组的2-d的网格点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以支持万博1manbetx更高的维度插值。主叫语法类似于griddata

scatteredInterpolant类

griddata当需要在一组预定义的网格点位置进行插值以查找值时,函数非常有用。在实际应用中,插值问题往往更为普遍scatteredInterpolant类提供了更大的灵活性。该课程有以下优点:

  • 它产生一个插值函数,可以有效地查询。也就是说,底层三角化只创建一次,并在后续查询中重用。

  • 内插方法可以独立于三角测量而改变。

  • 数据点上的值可以独立于三角剖分进行更改。

  • 数据点可以增量地添加到现有的内插,而不触发一个完整的重新计算。也可以有效地删除和移动数据点,只要编辑的点数量相对于样本点的总数较小。

  • 它提供了外推功能来逼近位于凸包外的点的值。看到外推散乱数据欲获得更多信息。

scatteredInterpolant提供以下插值方法:

  • “最近”-最近邻插值,插值曲面是不连续的。

  • “线性”- 线性内插(默认值),其中,内插表面为C0连续的。

  • '自然'-自然邻域插值,插值曲面除采样点外均为C1连续。

scatteredInterpolant类支持散乱数万博1manbetx据插值在2- d和3-d的空间。你可以通过调用创建插值scatteredInterpolant以及使所述点的位置和相应的值,并且任选地所述内插和外插的方法。查看scatteredInterpolant有关创建和计算语法的更多信息,请参阅参考页面scatteredInterpolant

插值散乱数据使用scatteredInterpolant类

这个例子说明如何使用scatteredInterpolant内插的散射采样山峰函数。

创建分散的数据集。

X = -3 + 6.*gallery(“uniformdata”,250年[2],0);V =山峰(X (: 1), (2):,);

创建interpolant。

F = scatteredInterpolant (X, V)
F = scatteredInterpolant with属性:点:[250x2双]值:[250x1双]方法:'线性'外推方法:'线性'

属性表示数据点的坐标,属性表示相关联的值。的方法属性表示执行该插值的插值方法。的ExtrapolationMethod属性表示当查询点落在外面的凸包所使用的外推法。

的属性F以同样的方式访问一个领域结构体。例如,使用F.Points来检查数据点的坐标。

评估interpolant。

scatteredInterpolant提供了插值的下标评价。它评估的方式作为功能相同。你可以按照如下方式评价插值。在这种情况下,在查询位置的值由下式给出VQ。您可以在单个查询点进行评估:

Vq = F([1.5 1.25])
Vq = 1.3966

你也可以传递单独的坐标:

Vq = F(1.5, 1.25)
Vq = 1.3966

你可以在点位置的向量计算:

Xq = [0.5 0.25;0.75 - 0.35;1.25 - 0.85);Vq = F (Xq)
Vq =3×11.0880 1.8127 2.3472

您可以评估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=“最近”;

重新评估并绘制插值像以前一样。

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,VY,VZ)。你可以将它们分配到值属性插值每个速度分量(V) 反过来。这具有重要的性能优势,因为它可以让你重复使用相同的插值而不会导致每次计算一个新的开销。

下列步骤显示了如何更改我们的例子中的值。您将使用计算表达式的值, v = x e - x 2 - y 2

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

求插值值并绘制结果。

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

向现有的内插添加额外的点位置和值。

这将执行有效的更新,而不是使用扩充的数据集进行完整的重新计算。

在添加示例数据时,重要的是要同时添加点位和相应的值。

继续示例,创建新的样本点,如下所示:

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

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

F.Points(端+(1:100),:) = X;F.Values(端+(1:100))= V;

评估细化插值并绘制结果。

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

从内插中删除数据。

您可以从内插中增量地移除样本数据点。您还可以从内插中删除数据点和相应的值。这对于消除假异常值是有用的。

当移除样本数据,以除去所述点的位置和相应的值都是重要的。

去掉第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)的插值)

复杂分散数据的插值

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

创建样本数据。

X = -3 + 6 .* gallery(“uniformdata”,250年[2],0);V =复数(X(:,1).*X(:,2), X(:,1)。^ 2 + X (:, 2) ^ 2);

创建interpolant。

F = scatteredInterpolant (X, V);

创建一个查询点网格,并在网格点上计算插值。

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

情节的真实成分VQ

VqReal =实际(Vq);图冲浪(Xq, Yq VqReal);包含(“X”);ylabel (“Y”);zlabel (“真正的价值 -  V”);标题(“内插值的实分量”);

积的虚分量VQ

VqImag = IMAG(VQ);图冲浪(Xq的,YQ VqImag);包含(“X”);ylabel (“Y”);zlabel (“虚数值 -  V”);标题(“插值值的虚分量”);

解决分散数据插值的问题

在前面的章节中,许多说明性的例子处理的是光滑表面上采样的点集的插值。此外,这些点的间隔相对均匀。例如,点簇之间的距离并不大。此外,插值在点位置的凸壳内得到了很好的评价。

当处理真实的插值问题时,数据可能更具挑战性。它可能来自可能产生不准确读数或异常值的测量设备。基础数据可能不会平滑地变化,值可能突然从一点跳到另一点。本节为您提供一些指导原则,以识别和解决分散数据插值的问题。

输入数据包含的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);
的样本点索引s,然后构造插值:
isnan(x) | isnan(y) | isnan(V);x (nan_flags) = [];y (nan_flags) = [];V (nan_flags) = [];F = scatteredInterpolant (x, y, V);
如果点位是矩阵形式,下面的例子也是类似的。首先,创建数据并替换一些条目值。
X =兰特(25,2)* 4-2;V = X(:,1)^ 2 + X(:,2)。^ 2;X(5,1)= NaN的;X(10,1)= NaN的;X(12,2)= NaN的;V(14) =南;
这段代码的错误:
F = scatteredInterpolant (X, V);
查找楠采样点指数,然后构建插值:
nan_flags = isnan (X (: 1)) | isnan (X (:, 2)) | isnan (V);X (nan_flags:) = [];V (nan_flags) = [];F = scatteredInterpolant (X, V);

插值输出NaN值

griddatagriddatan返回属性查询凸壳外的点时的值“线性”'自然'方法。但是,如果使用“最近”方法。这是因为查询点的最近邻居既存在于凸包内,也存在于凸包外。

如果你想计算凸壳外的近似值,你应该使用scatteredInterpolant。看到外推散乱数据欲获得更多信息。

处理重复点位置

输入数据很少是“完美的”,应用程序可能不得不处理重复的数据点位置。数据集中相同位置的两个或多个数据点可以有不同的对应值。在这个场景中,scatteredInterpolant合并的点并计算平均值对应的值。这个例子说明了如何scatteredInterpolant对具有重复点的数据集执行插值。

  1. 创建一些位于平面上的样本数据:

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

  2. 通过分配点50的坐标点100引入重复点的位置:

    X(50)= X(100);Y(50)= Y(100);

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

    F = scatteredInterpolant (x, y, V)

  4. 检查与第50点相关的值:

    F.Values(50)

这个值是原始的第50和第100个值的平均值,因为这两个数据点的位置相同:

(V (50) + V (100)) / 2
在这个场景中,插值器以合理的方式解决了歧义。但是在某些情况下,数据点可能是接近的而不是重合的,并且这些位置的值可能是不同的。

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

一式两份点位置存在替换值时,必须使用统一的数据管理。假设你有两套与100个数据点位置相关的值,并且你想通过替换值进行插值依次每套。

  1. 考虑两组值:

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

  2. 创建interpolant。scatteredInterpolant合并重复的位置,内插包含99个唯一的样本点:

    F = scatteredInterpolant (x, y, V1)
    直接替换值F.Values=V2意味着给99个样本分配100个值。前一个合并操作的上下文丢失;样本位置的数目与样本值的数目不匹配。内插将需要解决不一致性来支持查询。万博1manbetx

在这种更复杂的情况下,有必要删除之前创建和编辑插值的重复。使用独特的功能找到的独特点的指数。独特的还可以输出标识重复点索引的参数。

[~, I, ~] = unique([x y],'first','rows');我=(我);x = x(我);y = y(我);V1 =(我);V2 = V2 (I);F = scatteredInterpolant (x, y, V1)
现在你可以使用F插入第一个数据集。然后你可以替换这些值来插入第二个数据集。
F.Values=V2;

在编辑散射插值时实现效率

scatteredInterpolant您可以编辑代表样本值的属性(F.Values)及插补方法(F.Method)。由于这些特性是独立于基础三角测量,这些编辑操作能够有效地进行。然而,就像一个大阵的工作,你应该照顾编辑数据时不小心造成不必要的副本。当多于一个的可变的引用数组,该数组,然后编辑副本制成。

副本不包括以下内容:

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形三角形/四面体,支持更多的等边形。

  • 空的圆周属性,它隐式地定义了点之间的近邻关系。

空外接圆特性保证了插补值由采样点在查询地点附近的影响。尽管这些优势,在某些情况下,数据点的分布可能会导致差的结果,这通常发生在样本数据集的凸包的附近。当插值产生意外的结果,样本数据和下面的三角测量的曲线图通常可以提供深入的问题。

该示例示出的内插表面的边界附近恶化。

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

T = 0.4 * PI:0.02:0.6 * PI;X1 = cos(T)';Y1 = SIN(t)的“ -  1.02;X2 = X1;Y2 = Y1 *( -  1);X3 = linspace(-0.3,0.3,16)';Y3 =零(16,1);X = [X 1,X 2; X 3];Y = [Y 1; Y 2; Y 3];

现在把这些采样点举到表面上 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”)标题(“用于创建插值的三角化”)举行

红色边界内的三角形形状相对较好;它们是由非常接近的点构成的,插值算法在这个区域内工作得很好。在红色边界之外,三角形是像银条一样的,连接着彼此远离的点。由于没有足够的采样来准确地捕捉地表,所以这些地区的结果很差也就不足为奇了。在3-D中,对三角剖分的视觉检查有点棘手,但观察点分布通常有助于说明潜在的问题。

MATLAB®4griddata方法,v4的,不基于三角剖分,不受边界附近插值曲面恶化的影响。

[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”)标题(使用v4方法从griddata插值曲面,“fontweight”,“b”);

插值曲面griddata使用v4的方法对应于期望的实际曲面。