我们可以使用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
列出边缘。
答案 0 :(得分:1)
快速浏览g.edge_iterator??
建议的代码(您可以通过执行edge_iterator()
获得
返回的迭代器在任何顶点入射的边缘上
在参数“顶点”中给出。
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。