带有'立方'插值方法的网格数据返回NaN

时间:2010-09-06 09:43:26

标签: matlab

我发现,如果我使用griddata方法和Cubic插值方法,对于xy的某些值,它将返回NaNOne post说这是因为xy数据非常靠近凸包。

知道如何解决这个问题吗?

编辑:请注意,我无法确保输入单调增加(因此,gridfit不起作用)。原因是因为我必须对我的区域进行网格划分(可能是2D中的不规则多边形),在为每个点生成相应的Z值之前获取所有点。我的代码如下:

function ZI=Interpolate3D(scatteredData, boundary)
%scatteredData is the scattered points, boundary is the area that I want to generate 3D surface.



% Given the boundaries, generate mesh first 
[element,points]= GenMesh(boundary);
ZI = griddata(scatteredData(:,1),scatteredData(:,2),scatteredData(:,3),points(:,1),points(:,2), 'cubic',{'QJ'});

3 个答案:

答案 0 :(得分:5)

如果您的点位于凸包外,则无法使用立方选项从griddata获得除NaN以外的结果。如果该点在该行上,则可能导致NaN,具体取决于计算的最低有效位中发生的情况。

问题在于立方方法使用三角测量。如果你的点位于凸包外面,则三角测量在那一点上失败。

当然,你可以使用-v4方法,但是有很多很好的理由可以解释为什么它已被大大取代了。它使用基于距离的插值方法,其中对于n个数据点,必须生成完整的nxn矩阵。然后使用该矩阵求解方程组。即使是中等大问题,这也会非常缓慢。

-v4方法的优点是它可以顺利推断而不产生nans。这就是它留在那里的原因。

对于需要平滑结果的较大问题,并且您仍希望在凸包外部进行外推,可以使用我的gridfit工具。它确实做了平滑,而不是纯插值。

所有这些方法都需要权衡,必须针对您的特定问题进行权衡。

答案 1 :(得分:1)

自Matlab R2013a发布以来,您可以使用scatteredInterpolant代替griddata。 这有几个好处:

  • Matlab可以在scatteredInterpolant对象上执行插值和外推。您可以在分散数据的凸包外指定一个点,但仍然不会获得NaN。

  • 创建后,scatteredInterpolant对象可以多次评估,与调用griddata几次相比,可以节省计算时间。

在不利方面:虽然您可以指定插值和外推方法,但cubic不可用,只有linearnearestnatural

使用scatteredInterpolant您的代码可能看起来像

F = scatteredInterpolant(scatteredData(:,1),scatteredData(:,2),scatteredData(:,3));
ZI=F(points(:,1),points(:,2));

答案 2 :(得分:0)

您确定要立方插值吗?对于某些输入数据,计算出的z节点可能具有极大的值!

我总是使用-v4选项,例如链接提及中的帖子。你也可以通过delaunayn玩Qhull中使用的选项,有些(但不是全部)是{'Qt','Qbb','Qc'} http://www.qhull.org/html/qhull.htm