Matlab delaunayn与Scipy Delaunay的区别

2024-05-23 13:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图复制N维Delaunay三角剖分,它由Python中的matlabdelaunayn函数使用scipy.spatial.Delaunay公司功能。然而,虽然Matlab函数给出了我想要和期望的结果,但scipy却给了我不同的结果。我觉得这很奇怪,因为这两个都是QHull库的包装器。我假设Matlab在调用中隐式地设置了不同的参数。我试图在它们之间复制的情况可以在Matlab's documentation中找到。在

设置是有一个中心点的立方体,如下所示。我提供的蓝线是为了帮助形象化这个形状,但它们对这个问题没有任何意义。在

A cube with a point in the center

我期望从这得到的三角剖分结果是12个简单化(在Matlab示例中列出),如下所示。在

Matlab's triangulation

然而,这个python等价物产生了“额外”的简单。在

x = np.array([[-1,-1,-1],[-1,-1,1],[-1,1,-1],[1,-1,-1],[1,1,1],[1,1,-1],[1,-1,1],[-1,1,1],[0,0,0]])
simp = scipy.spatial.Delaunay(x).simplices

返回的变量simp应该是一个mxn数组,其中M是找到的simplice的数量(对于我的例子应该是12),N是单纯形中的点数。在这种情况下,每个单纯形应该是一个四面体,意思是N是4。在

但是我发现m实际上是18,额外的6个单体不是四面体,而是立方体的6个面。在

这是怎么回事?我怎样才能限制返回的简单体是四面体呢?我用这个简单的例子来演示这个问题,所以我想要一个不适合这个问题的解决方案。在

编辑

多亏了Amro的回答,我能够解决这个问题,并且可以在simplices中找到Matlab和Scipy之间的匹配。有两个因素在起作用。首先,如前所述,Matlab和Scipy使用不同的QHull选项。第二,QHull返回体积为零的simplice。Matlab删除了这些,Scipy没有,这在上面的例子中很明显,因为所有6个额外的简单体都是立方体的零体积共面面面。可以用下面的代码在N维中删除它们。在

^{pr2}$

我想应该解决其他条件,但我保证我的点已经不包含重复项,并且定向条件似乎对我可以识别的输出没有影响。在


Tags: 函数情况scipyspatialdelaunay剖分例子simp
1条回答
网友
1楼 · 发布于 2024-05-23 13:41:46

比较MATLAB和SciPy函数的一些注意事项:

  • 根据MATLAB文档,默认情况下它是usesQt Qbb QcQhull选项用于三维输入,而SciPyusesQt Qbb Qc Qz

  • 不确定这是否重要,但NumPy数组的顺序与在MATLAB中使用ndgrid创建的点的顺序不同。

实际上,如果您查看edit delaunayn.m中的MATLAB代码,您可以看到执行了三个额外的步骤:

  • 首先,它合并重复点mergeDuplicatePoints(在您的例子中这不是问题)
  • 然后它对这些点强制执行一个方向约定(参见代码)
  • 最后,从Qhull(实现为MEX函数qhullmx)得到结果后,在几行代码上面有以下注释:

    Strip the zero volume simplices that may have been created by the presence of degeneracy.

因为这个文件是有版权的,所以我不会在这里发布代码,但是你可以在你这边检查一下。

相关问题 更多 >