我发现如果我使用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'});发布于 2010-09-06 21:02:05
如果您的点位于凸包之外,则无法使用NaN选项从栅格数据中获得除立方体以外的结果。如果点在直线上,则可能会产生NaN,这取决于计算的最低有效位发生了什么。
问题是立方方法使用三角剖分。如果您的点在凸包之外,则在该点上三角剖分失败。
当然,您可以使用-v4方法,但是有非常充分的理由说明为什么它在很大程度上被取代了。它使用基于距离的插值方法,其中对于n个数据点,必须生成完整的n×n矩阵。然后使用该矩阵求解一组方程。即使是中等规模的问题,这也会相当慢。
-v4方法的优点是它将平滑地外推,而不会产生nans。这就是它被留在那里的原因。
对于更大的问题,你需要一个平滑的结果,并且你仍然希望在凸包之外进行推断,你可以使用我的gridfit工具。它做的是平滑,而不是纯插值。
所有这些方法都有权衡,您必须解决您的特定问题。
发布于 2018-05-14 23:03:10
自从Matlab R2013a发布以来,你可以使用scatteredInterpolant而不是griddata。这有几个优点:
scatteredInterpolant对象执行插值和外推。您可以在散乱数据的凸包之外指定一个点,但仍然得不到NaN。scatteredInterpolant对象,因此与多次调用griddata相比,可以节省计算时间。缺点:虽然您可以指定插值和外推方法,但cubic不可用,只能使用linear、nearest和natural。
使用scatteredInterpolant,您的代码可能如下所示
F = scatteredInterpolant(scatteredData(:,1),scatteredData(:,2),scatteredData(:,3));
ZI=F(points(:,1),points(:,2));发布于 2010-09-06 20:14:00
您确定要使用三次插值吗?对于某些输入数据,计算出的z节点可能会有非常大的值!
我总是使用-v4选项,就像你链接中提到的帖子一样。你也可以通过delaunayn使用Qhull中使用的选项,其中一些(但不是全部)是{'Qt','Qbb','Qc'} http://www.qhull.org/html/qhull.htm
https://stackoverflow.com/questions/3650449
复制相似问题