我试图复制N维Delaunay三角剖分,它由Python中的matlabdelaunayn函数使用scipy.spatial.Delaunay公司功能。然而,虽然Matlab函数给出了我想要和期望的结果,但scipy却给了我不同的结果。我觉得这很奇怪,因为这两个都是QHull库的包装器。我假设Matlab在调用中隐式地设置了不同的参数。我试图在它们之间复制的情况可以在Matlab's documentation中找到。在
设置是有一个中心点的立方体,如下所示。我提供的蓝线是为了帮助形象化这个形状,但它们对这个问题没有任何意义。在
我期望从这得到的三角剖分结果是12个简单化(在Matlab示例中列出),如下所示。在
然而,这个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}$我想应该解决其他条件,但我保证我的点已经不包含重复项,并且定向条件似乎对我可以识别的输出没有影响。在
比较MATLAB和SciPy函数的一些注意事项:
根据MATLAB文档,默认情况下它是uses
Qt Qbb Qc
Qhull选项用于三维输入,而SciPyusesQt Qbb Qc Qz
。不确定这是否重要,但NumPy数组的顺序与在MATLAB中使用
ndgrid
创建的点的顺序不同。实际上,如果您查看
edit delaunayn.m
中的MATLAB代码,您可以看到执行了三个额外的步骤:mergeDuplicatePoints
(在您的例子中这不是问题)最后,从Qhull(实现为MEX函数
qhullmx
)得到结果后,在几行代码上面有以下注释:因为这个文件是有版权的,所以我不会在这里发布代码,但是你可以在你这边检查一下。
相关问题 更多 >
编程相关推荐