罗兰关于MATLAB的艺术

将想法转化为MATLAB

自然近邻-一种极好的插值方法

我很高兴欢迎Damian Sheehy成为本周的客座博主。Damian在MathWorks从事几何相关特性的开发工作。他将回答两个经常被问到的问题;一个是关于零散数据插值的,他将在本博客中介绍,另一个是关于德劳内三角法的,他将在下一篇文章中介绍。交给你了,戴米安…

内容

来自客户支持的电子邮件金宝app

我偶尔会收到一封来自客户支持部门的电子邮件,标题类似于这个:“griddata给出不金宝app同的结果……".支持工程金宝app师是伟大的,他们真的知道如何选择一个好的主题,以吸引开发人员的注意,并迅速得到客户的回应。标题行同样可以很好地引用scatteredInterpolant因为它共享相同的底层代码griddata.在我打开电子邮件之前,我对造成这种差异的原因有强烈的怀疑。如果第一行是这样开头的:“一个客户升级到MATLAB R20**和griddata给出了与之前不同的结果……”,然后我相当确信问题是什么。我查看客户的数据集,执行一些计算,创建一个图,然后就完成了!,I have a canned response and recommendation at the ready and I turn around the question in a matter of minutes.

为什么griddatascatteredInterpolant可能是不一致的

那么为什么griddatascatteredInterpolant升级MATLAB后给出不同的答案?MathWorks做了什么来解决这个问题?零散数据插值是否存在用户应该注意的问题?是的,有一些微妙的行为与最近邻和离散数据插值的线性插值方法有关。这些问题在特定的数据集中出现,在MATLAB升级后,其影响可能表现为数值上的差异。我将解释这些问题的起源,以及作为用户可以避免这些问题的方法。我还将重点介绍MathWorks为解决这些问题所做的工作。

首先,让我们看看引发问题的行为和数据。为了演示,我将选择一个简单的数据集,其中在一个正方形的角上有四个点。每个样本点都有一个不同的值,我们的目标是计算一个插值值在正方形内的某个查询点。这里有一个图:

Px = [0;1;1;0);Py = [0;0;1;1);V = [10;1000; 50; 100]; plot(Px, Py,”或“)举行文本(Px + 0.02, Py + 0.02, {“P1(10)”“P2(1000)”“P3(50)”“P4(100)”}) pq = [0.5 0.5];情节(pq (: 1), pq (:, 2),‘* b”)举行平等的

首先,让我们考虑最近邻插值方法。对于方框内的任何查询点,内插值是与最近邻居相关联的值。上面的图说明了括号中的配置和示例值。我们可以看到,当查询点位于正方形的中心时,会出现歧义。有四种可能的插值解,根据该方法的定义,这四种值中的任何一种都是有效解。金宝搏官方网站理想情况下,我们希望得到相同的结果,无论MATLAB运行在什么计算机上,无论版本是什么。

这种类型的问题也可以出现在线性插值方法。为了进行线性插值,首先使用Delaunay三角剖分对分散数据集进行三角剖分。在一个查询点上的插值值是由包围这个点的三角形顶点的值推导出来的。但是这个数据集的Delaunay三角剖分不是唯一的,下图显示了两种有效的配置。

次要情节(1、2、1);Px = [0;1;1;0;0;1);Py = [0;0;1; 1; 0; 1]; pq = [0.5 0.25]; plot(Px, Py,“- b”)举行情节(pq (: 1), pq (:, 2),”或“)举行平等的次要情节(1、2、2);Px = [0;0;1;1;0;1);Py = [1;0;0; 1; 1; 0]; plot(Px, Py,“- b”)举行情节(pq (: 1), pq (:, 2),”或“)举行平等的

线性插值中不一致行为的例子

每个场景的插值结果都是不同的。下面的框架给出了演示这一点的代码,我打乱了一个数据点,以翻转三角剖分的对角线,并说明了效果。

P = [0 0;1 0;1 1;每股收益(1-eps);];V = [10;1000;50;100);Pq = [0.5 0.25];F = scatteredInterpolant (P, V); linearVq = F(pq) P = [0 0; 1 0; 1 1; -eps (1+eps);]; F.Points = P; linearVq = F(pq)
线性vq = 267.5

为什么自然邻域插值更优

查询点的插值值,linearVq,对于在平局情况下如何创建三角剖分边非常敏感。这种中断称为简并,当我们在二维中有4个或更多的共圆点或在三维中有5个或更多的共球面点时,这个问题就会出现在狄洛尼三角剖分中。现在观察当我们选择自然邻居插值方法时的行为。这种方法也基于底层的Delaunay三角剖分,但它在对角线交换的情况下产生相同的结果。这里是:

P = [0 0;1 0;1 1;每股收益(1-eps);];F.Points = P;F.Method =“天然”;naturalVq = F(pq) P = [0 0;1 0;1 1;每股收益(1 + eps);];F.Points = P;naturalVq = F (pq)
naturalVq = 397.5

自然邻居也是一个更平滑的插值函数,所以自然邻居比线性更有意义。这就引出了一个问题:Natural Neighbor方法不应该是默认方法吗?这将是我们首选的默认选择,但这个方法被添加到MATLAB后很长时间griddata介绍了线性方法。更改默认值将产生重大影响,因此更改将比它所解决的问题更具破坏性。自然邻居方法在计算上也更昂贵,因此对于大型数据集,出于性能原因,线性可能是首选方法。

我们刚刚回顾的示例强调了问题的本质,并为您提供了一个更稳定的替代方案,以避免在升级MATLAB后因分散数据插值而产生的电位差。对于我们在这里开发的部分,我们早就认识到这些类型的问题会给用户带来问题,我们已经采用了更好的底层算法来解决它们。如果你是MATLAB和griddata函数,您可能会回忆起更多烦人的过去行为。在R2009a之前,使用现在是冗余的方法重复调用该函数{' QJ '}Qhull选项在每次调用中给出了可能不同的结果。这个问题在R2009a中得到了解决,同时引入了自然邻居插值,因为它的稳定性和优越的插值特性。从那时起,对基础三角剖分算法的改进使所有平台(先是二维,然后是三维)的结果稳定且一致。不幸的是,引入这些改进意味着特定数据集的升级行为可能会发生变化,但这就像打破鸡蛋做蛋糕一样。展望未来,基于Delaunay三角剖分的函数的行为应该更加稳定。当然,对编码算法的基本更改可能会触发我们所看到的更改,尽管问题的范围已经大大缩小了。

你告诉我!

自从在R2009a中发布以来,我还没有收到很多与金宝appNatural Neighbor插值相关的支持升级问题。我经常想,这是因为它对用户来说工作得很好,还是用户可能不使用它。与最近邻插值相似的命名可能会导致一些人对该方法的误解。你呢,你用过自然邻居插值吗?请让我知道在这里




发布与MATLAB®R2015a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。