我喜欢在有向邻接矩阵中查找循环。矩阵是稀疏的,在从i-> j的(i,j)有向边处包含1。没有其他边沿,并且没有一个或多个不相交的循环/循环。
最初,我有一个带有定向三角形的三角形网格,并创建了一个邻接矩阵,然后删除了内部边缘(这是通过创建一个无向的对称邻接矩阵来完成的,找到值= 2的内部边缘,然后将它们从有向网格中删除(非符号)adj矩阵)。如果网格是流形的(我之前测试过),则边界边缘将形成单独的边界环。有没有一种有效的方法可以从python的稀疏矩阵中找到所有这些循环?
想法是找到第一个非零列。获取条目索引,然后在该索引处获取列,直到我们再次到达第一个索引。记录条目将完成循环,将数据条目设置为零将从矩阵中删除此循环,然后继续下一个循环。我还考虑过将一列(起始)与矩阵迭代相乘,直到在行(起始)处获得一个条目。
def tria_get_boundary(t):
import numpy as np
adj = tria_get_adj(t, directed=False)
if (np.max(adj.data) > 2):
raise ValueError('Error: tria not manifold (edges with more than 2 triangles)!')
if (1 not in adj.data):
return []
# get directed matrix of only boundary edges
inneredges = (adj==2)
adj = tria_get_adj(t,directed=True)
adj[inneredges] = 0
adj.eliminate_zeros()
# find loops
firstcol = np.nonzero(adj.indptr)[0][0]-1
loops=[]
while not firstcol == []:
loop = [firstcol]
adj.data[adj.indptr[firstcol]] = 0 # visited
ncol =adj.indices[adj.indptr[firstcol]]
while not ncol == firstcol:
loop.append(ncol)
adj.data[adj.indptr[ncol]] = 0 # visited
ncol = adj.indices[adj.indptr[ncol]]
adj.eliminate_zeros()
loops.append(loop)
nz = np.nonzero(adj.indptr)[0]
if len(nz) > 0:
firstcol = nz[0]-1
else:
firstcol=[]
return loops
这可以更有效地完成(或使用更多的pythonic方法)吗? 谢谢。