matlab中的delaunay,python – Matlab delaunayn和Scipy Delaunay之间的区别
我正在嘗試使用scipy.spatial.Delaunay函數復制由Python中的Matlab delaunayn函數執行的N維Delaunay三角剖分.然而,雖然Matlab函數給了我想要和期望的結果,但是scipy給了我不同的東西.考慮到兩者都是QHull庫的包裝器,我發現這很奇怪.我假設Matlab在其調用中隱式設置了不同的參數.我試圖在他們兩個之間復制的情況可以在Matlab’s documentation找到.
設置是在中心有一個點,如下所示.我提供的藍線有助于形象化,但它們沒有任何目的或意義.
我期望的三角測量結果是12個單純形式(在Matlab示例中列出),如下所示.
然而,這個python等效產生“額外”的單純形.
x = np.array([[-1,-1,-1],[-1,1],1,[1,[0,0]])
simp = scipy.spatial.Delaunay(x).simplices
返回的變量simp應該是一個M×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中的delaunay,python – Matlab delaunayn和Scipy Delaunay之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CISAW信息安全保障人员--风险管理
- 下一篇: 基于主题模型的专利文本挖掘