我们可以使用incidence_matrix(oriented=None, sparse=True, vertices=None)
in SageMath方法获得有向图的关联矩阵。
每行都是一个顶点,每列都是一个边。顶点按照方法
vertices()
获得的顺序排序,除非给出参数vertices
,并且边缘由方法edge_iterator()
获得。
我的问题是如何指定顶点顺序和边缘顺序?
例如,g
是一个有10条边的加权有向图:
edges = [('s', 'x', 3), ('s', 'y', 5),
('x', 'y', 2), ('x', 'z', 6),
('y', 'x', 1), ('y', 'z', 4), ('y', 't', 6),
('z', 't', 2),
('t', 's', 3), ('t', 'z', 7)]
g = DiGraph(edges)
我想安排入射矩阵,使得顶点(从上到下)按s, x, y, z, t
排序,边缘按edges
排序(从左到右)(即按字母顺序s, x, y, z, t
列出边缘)。
快速浏览g.edge_iterator??
的代码(你可以通过edge_iterator()
获得)
返回的迭代器遍历任何顶点的边缘 在参数“vertices”中给出。
if oriented:
for e, (i, j) in enumerate(self.edge_iterator(labels=False)):
if i != j:
m[verts[i],e] = -1
m[verts[j],e] = +1
else:
for e, (i, j) in enumerate(self.edge_iterator(labels=False)):
m[verts[i],e] += 1
m[verts[j],e] += 1
告诉我,可能需要修改代码才能改变顺序。
这似乎是一个合理的要求,可以自定义,所以我为此打开了Sage Trac ticket 27513。