文件

插值散乱数据

分散的数据

分散的数据包括一组点X.和相应的值V.,点在它们的相对位置之间没有结构或顺序。有各种各样的方法来插值分散的数据。一种广泛使用的方法是对点进行Delaunay三角剖分。

这个例子展示了如何通过三角化点和提升顶点的大小来构建一个插值曲面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;holdplot3(X(:,1),X(:,2),零(15,1),'* r')轴([- 4,4,- 4,4,0,25]);网格stem3 (X (: 1), (:, 2), V,'^'“填满”抱紧离开视图(322.5,30);

创建一个Delaunay三角剖分,提升顶点,并在查询点计算插值XQ

图(“颜色”“白”t = delaunay(X(:,1),X(:,2));holdtrimesh(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),零(15,1),'* r')轴([- 4,4,- 4,4,0,25]);网格plot3(-2.6,-2.6,0,'* b''linewidth',1.6)Plot3([ -  2.6 -2.6]',[ -  2.6 -2.6]',[013.52]',“- b”'linewidth',1.6)持有离开视图(322.5,30);文本(-2.0,-2.6,'Xq的''fontWeight设置''大胆'......'的Horizo​​ntalAlignment'“中心”“写成BackgroundColor”“没有”);

这一步通常涉及遍历三角数据结构,以找到包含查询点的三角形。一旦找到了点,计算值的后续步骤取决于插值方法。您可以计算邻域中最近的点,并使用该点的值(最近邻插值法)。您还可以计算外围三角形的三个顶点的值的加权和(线性插值方法)。这些方法和它们的变体涵盖在文本和参考资料的分散数据插值。

虽然插图突出显示2-D插值,但您可以将该技术应用于更高的维度。在更一般的条件下,给出了一系列积分X.和相应的值V.,你可以构造一个这种形式的插值V = F(X).您可以在查询点评估插值XQ,给予Vq = F (Xq).这是一个单值函数;对于任何查询点XQ在…的凸壳内X.,它将产生一个独特的值VQ..为了产生令人满意的插值,假定样本数据符合这一性质。

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

griddata函数支持二维离散数金宝app据插值。当栅格坦函数支持N-D离散金宝app数据插值;然而,对于中等到较大的点集,它在高于6-D的维度上是不实用的,因为底层三角剖分所需的内存是指数增长的。

scatteredInterpolant类支持二维和金宝app三维空间中的离散数据插值。鼓励使用这个类,因为它更有效,容易适应更广泛的插值问题。

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

griddata栅格坦函数取一组样本点,X.,相应的值,V.和查询点,XQ,并返回内插的值,VQ..调用语法对于每个功能类似;主要区别是2-D / 3-D.griddata函数允许您根据X.y/X.yZ.坐标。这两个函数内插在预定的网格点位置散射的数据;意图是产生网格数据,因此而得名。插值是在实践中更普遍。您可能需要在点的凸包内的任意位置进行查询。

这个例子展示了griddata功能在一组网格点插值并使用该网格数据以创建轮廓图。

画出Seamount.数据集(aSeamount.是一个水下山脉)。该数据集包括一组经度的(X.)及纬度(y)位置,和相应的Seamount.海拔(Z.)。

负载Seamount.plot3(x,y,z,''“markersize”,12)Xlabel(“经度”)ylabel(“纬度”) zlabel (“深度尺”)网格

采用meshgrid.在经纬度平面,然后使用创建一组的2-d的网格点griddata在这些点处插入相应的深度。

图[xi,yi] = meshgrid(210.8:0.01:211.8,-48.5:0.01:-47.9);zi = griddata(x,y,z,xi,yi);冲浪(xi,yi,zi);xlabel(“经度”)ylabel(“纬度”) zlabel (“深度尺”

既然数据是一个网格格式,计算和绘制轮廓。

图并[c,H] =轮廓(XI,苡仁,ZI);clabel(C,H);xlabel(“经度”)ylabel(“纬度”

你也可以使用griddata在数据集的凸包内的任意位置进行插值。例如,坐标(211.3,-48.2)处的深度为:

滋=的GridData(X,Y,Z,211.3,-48.2);

每次都计算底层三角测量griddata函数被调用。如果同一数据集与不同的查询点反复插入这会影响性能。当scatteredInterpolant类中描述插值散乱数据使用scatteredInterpolant类在这方面效率更高。

MATLAB软件还提供栅格坦以支持金宝app更高的维度插值。主叫语法类似于griddata

scatteredInterpolant类

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

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

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

  • 数据点上的值可以独立于三角剖分而改变。

  • 数据点可逐步添加到现有的插值,而不会触发一个完整的重新计算。数据点也可以被删除并移动有效,提供编辑点的数量是相对于采样点的总数小。

  • 它提供了外推功能,用于逼近位于凸包外的点上的值。看到推断分散的数据有关更多信息。

scatteredInterpolant提供了以下内插方法:

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

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

  • “自然”- 天然邻插值,其中,所述内插表面C1除了在采样点是连续的。

scatteredInterpolant类支持二维和金宝app三维空间中的离散数据插值。你可以通过调用创建插值scatteredInterpolant以及使所述点的位置和相应的值,并且任选地所述内插和外插的方法。看看scatteredInterpolant有关可用于创建和计算的语法的更多信息,请参阅scatteredInterpolant

插值散乱数据使用scatteredInterpolant类

这个例子说明如何使用scatteredInterpolant插入一个分散的采样山峰功能。

创建分散的数据集。

X = -3 + 6 *廊('uniformdata', 250年[2],0);V =山峰(X (: 1), (2):,);

创建插值。

f =散射interpolant(x,v)
f =具有属性的散射interpolant:点:[250x2双]值:[250x1双]方法:'linear'外推方法:'linear'

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

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

评估插值。

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);xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B');zlabel (“价值——V”“fontweight”'B');标题(“线性内插法”“fontweight”'B');

更改插值方法。

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

F.Method =“最近的”

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

Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);xlabel(“X”“fontweight”'B'),ylabel('是'“fontweight”'B') zlabel (“价值——V”“fontweight”'B')标题('最近的邻插液方法'“fontweight”'B');

将插值方法改为自然近邻法,重新评估,并绘制结果。

F.Method =“自然”;Vq = F (Xq, Yq);图冲浪(Xq, Yq Vq);xlabel(“X”“fontweight”'B'),ylabel('是'“fontweight”'B') zlabel (“价值——V”“fontweight”'B')标题('自然邻插值方法'“fontweight”'B');

在样本数据的位置的替换值。

您可以更改这些值V.在样本数据位置,X.,在飞行中。这在实践中很有用,因为一些插值问题可能在同一位置有多个值集。例如,假设您想插值一个由位置定义的三维速度场(X.yZ.)和相应的组件化速度向量(VXvy.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);xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B') zlabel (“价值——V”“fontweight”'B')标题(v = x.*exp(-x.^2-y.^2)的自然近邻插值

添加其他点位置和值现有的插值。

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

当添加样本数据,它以添加两个点位置和相应的值是重要的。

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

X = -1.5 + 3 *兰特(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);xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B');zlabel (“价值——V”“fontweight”'B');

从插值中删除数据。

您可以逐步删除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);xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B');zlabel (“价值——V”“fontweight”'B');标题('V = X * EXP的插值(-x ^ 2-Y ^ 2)与采样点除去'

复杂分散数据的插值

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

创建示例数据。

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

创建插值。

F = scatteredInterpolant(X,V);

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

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

画出的实分量VQ.

VqReal =实际(VQ);图冲浪(Xq的,YQ VqReal);xlabel(“X”);ylabel('是');zlabel (“实际价值- V”);标题('内插值的真实成分');

积的虚分量VQ.

VqImag = IMAG(VQ);图冲浪(Xq的,YQ VqImag);xlabel(“X”);ylabel('是');zlabel (“虚值- V”);标题(“内插价值的虚构成分”);

在散乱数据插值解决问题

许多的在前面的部分的说明性实施例涉及在光滑表面上被取样点集合的内插。另外,点被相对均匀地间隔开。例如,点的集群不是由相对大的距离分隔开。此外,插值是在点位置的凸包内以及评价。

在处理现实世界的插值问题时,数据可能更具挑战性。它可能来自测量设备,该设备可能产生不准确的读数或异常值。底层数据可能不顺畅变化,值可以从点到点突然跳跃。本节为您提供了一些指导方针来识别和解决分散数据插值的问题。

输入数据包含的NaN

你应该样品进行预处理的数据包含值以删除值这个数据不能有助于插值。如果A.删除时,相应的数据值/坐标也应删除,以确保一致性。如果值存在于样本数据,调用时的构造将出错。

以下示例说明了如何删除s。

创建一些数据并替换一些条目

x = rand(25,1)* 4-2;y = rand(25,1)* 4-2;v = x。^ 2 + y。^ 2;x(5)=南;X(10)= NaN;y(12)= nan;v(14)=南;
此代码错误:
F = scatteredInterpolant (x, y, V);
的样本点指数s然后构建插值:
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);
找到NaN的采样点指标,然后构造插值:
nan_flags = isnan(X(:,1))|isnan(X(:,2))|isnan(V);X(nan_flags,:) = [];V(nan_flags)= [];F = scatteredInterpolant(X,V);

Interpolant输出NaN值

griddata栅格坦返回属性查询凸包外的点时'线性'或者“自然”方法。但是,如果使用的是使用该点查询相同点,则可以期待数值结果“最近的”方法。这是因为,最近邻查询点存在内外的凸包。

如果要在凸船外计算近似值,则应使用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. 创建插值。注意F.包含99独特的数据点:

    f =散射interpolant(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. 创建插值。scatteredInterpolant合并重复的位置和插值包含99唯一的样本点:

    F = scatteredInterpolant(X,Y,V1)
    通过直接替换值F.Values = V2.指99个样品分配100个值。先前的合并操作的上下文丢失;样品位置的数量将不匹配的样本值的数目。该插值将要求不一致得到解决,以支持查询。金宝app

在这种更复杂的情况下,有必要删除之前创建和编辑插值的重复。用来独特函数来求唯一点的指标。独特还可以输出标识重复点指数的参数。

[〜,I,〜] =唯一的([X Y], '第一', '行');I =排序(I);X = X(I);Y = Y(I);V1 = V1(I);V2 = V2(I);F = scatteredInterpolant(X,Y,V1)
现在你可以使用F.来内插所述第一数据集。然后,你可以替换值插值第二个数据集。
F.Values = V2;

当编辑一个分散的插值时实现效率

scatteredInterpolant您可以编辑代表样本值的属性(F.Values)和内插方法(F.Method.).由于这些属性独立于底层的三角剖分,因此可以有效地执行编辑。但是,与处理大型数组一样,在编辑数据时,应该注意不要意外地创建不必要的副本。当多个变量引用一个数组并对该数组进行编辑时,就会进行复制。

副本未执行以下操作:

A1 =魔法(4)A1(4,4)= 11
但是,在此方案中进行了一种副本,因为数组由另一个变量引用。阵列A1A2编辑完成后,不能再共享相同的数据:
A1 = magic(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将在这种设置下优化性能。

插值效果差近凸包

德劳内三角非常适合散乱数据插值问题,因为它有产生好的效果良好的几何性质。这些属性是:

  • 拒绝银色三角形/四面体,以支持更多的等边形。

  • 隐含地定义点之间的最近邻居关系的空矩阵属性。

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

这个例子显示了在边界附近恶化的插值表面。

创建一个简单的数据集,将表现出边界附近的问题。

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)xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B') zlabel (“价值——V”“fontweight”'B')标题('内插表面');

实际的表面是:

。滋= XI ^ 2 +易^ 2。图目(XI,苡仁,ZI)标题(“实际的表面”

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

DT =德劳内三角化(X,Y);图图(X,Y,'* r')轴平等holdtriplot(DT)图(X1,Y1,“- r”)图(X2,Y2,“- r”)标题('用于创建Interpolant的三角估计'抱紧离开

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

该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)xlabel(“X”“fontweight”'B'), ylabel ('是'“fontweight”'B') zlabel (“价值——V”“fontweight”'B')标题('用v4方法从网格数据中插入曲面'“fontweight”'B');

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