gpt4 book ai didi

python - Matlab delaunayn 和 Scipy Delaunay 之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:53 26 4
gpt4 key购买 nike

我正在尝试使用 scipy.spatial.Delaunay 函数复制由 Python 中的 Matlab delaunayn 函数执行的 N 维 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 应该是一个 M x N 数组,其中 M 是找到的单纯形的数量(对于我的情况应该是 12),N 是单纯形中的点数。在这种情况下,每个单纯形应该是一个四面体,这意味着 N 是 4。

不过我发现 M 实际上是 18,另外 6 个单纯形不是四面体,而是立方体的 6 个面。

这是怎么回事?如何将返回的单纯形限制为四面体?我用这个简单的案例来演示问题,所以我想要一个不适合这个问题的解决方案。

编辑

多亏了 Amro 的回答,我才能够解决这个问题,并且我可以在 Matlab 和 Scipy 之间进行单纯形匹配。有两个因素在起作用。首先,正如所指出的,Matlab 和 Scipy 使用不同的 QHull 选项。其次,QHull 返回零体积的单纯形。 Matlab 删除了这些,Scipy 没有。这在上面的例子中很明显,因为所有 6 个额外的单纯形都是立方体的零体积共面。可以使用以下代码在 N 维中删除这些。

N = 3 # The dimensions of our points
options = 'Qt Qbb Qc' if N <= 3 else 'Qt Qbb Qc Qx' # Set the QHull options
tri = scipy.spatial.Delaunay(points, qhull_options = options).simplices
keep = np.ones(len(tri), dtype = bool)
for i, t in enumerate(tri):
if abs(np.linalg.det(np.hstack((points[t], np.ones([1,N+1]).T)))) < 1E-15:
keep[i] = False # Point is coplanar, we don't want to keep it
tri = tri[keep]

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

最佳答案

比较 MATLAB 和 SciPy 函数的一些笔记:

  • 根据 MA​​TLAB 文档,默认情况下它是 uses Qt Qbb Qc 用于 3 维输入的 Qhull 选项,而 SciPy uses Qt 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.

由于该文件受版权保护,我不会在此处发布代码,但您可以自行查看。

关于python - Matlab delaunayn 和 Scipy Delaunay 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com