我发现,如果我使用griddata
方法和Cubic
插值方法,对于x
,y
的某些值,它将返回NaN
。 One post说这是因为x
和y
数据非常靠近凸包。
知道如何解决这个问题吗?
编辑:请注意,我无法确保输入单调增加(因此,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'});
答案 0 :(得分:5)
如果您的点位于凸包外,则无法使用立方选项从griddata获得除NaN以外的结果。如果该点在该行上,则可能导致NaN,具体取决于计算的最低有效位中发生的情况。
问题在于立方方法使用三角测量。如果你的点位于凸包外面,则三角测量在那一点上失败。
当然,你可以使用-v4方法,但是有很多很好的理由可以解释为什么它已被大大取代了。它使用基于距离的插值方法,其中对于n个数据点,必须生成完整的nxn矩阵。然后使用该矩阵求解方程组。即使是中等大问题,这也会非常缓慢。
-v4方法的优点是它可以顺利推断而不产生nans。这就是它留在那里的原因。
对于需要平滑结果的较大问题,并且您仍希望在凸包外部进行外推,可以使用我的gridfit工具。它确实做了平滑,而不是纯插值。
所有这些方法都需要权衡,必须针对您的特定问题进行权衡。
答案 1 :(得分:1)
自Matlab R2013a发布以来,您可以使用scatteredInterpolant
代替griddata
。
这有几个好处:
Matlab可以在scatteredInterpolant
对象上执行插值和外推。您可以在分散数据的凸包外指定一个点,但仍然不会获得NaN。
创建后,scatteredInterpolant
对象可以多次评估,与调用griddata
几次相比,可以节省计算时间。
在不利方面:虽然您可以指定插值和外推方法,但cubic
不可用,只有linear
,nearest
和natural
。
使用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