[英]Find all the missing directed edges in an adjacency matrix
我使用numpy
矩阵来表示有向图,如下所示:
0 0 0
1 0 1
1 0 0
给定这样的矩阵,我想找到所有缺失的有向边,其中存在相反方向的有向边。
例如,在上面的矩阵中,对于节点1
(索引0),在这个意义上缺少边缘1 -> 2
和1 -> 3
,因为在另一个方向上存在边缘2 -> 1
和3 -> 1
。 类似地,边缘3 -> 2
也缺失,因为存在边缘2 -> 3
。
我的应用程序中的实际矩阵很大,例如数千个节点,用于查找这些边缘的算法必须很快。 蛮力方法是检查每对(给定矩阵的主对角线对称)并查看两者之间是否缺少边缘。
我想知道是否有更有效的方法(由numpy
提供?)来做到这一点。 一些线性代数技巧?
我稍微修改了你的例子,以显示一对节点在两个方向上连接的情况。 这是一种用numpy做的方法:
import numpy as np
A = np.array([[0, 1, 0],
[1, 0, 1],
[1, 0, 0]]).astype(bool)
A = A
print A.astype(int)
B = A.transpose() & ~A
print B.astype(int)
这应该给:
[[0 1 0]
[1 0 1]
[1 0 0]]
[[0 0 1]
[0 0 0]
[0 1 0]]
我相信这就是你想要的。 如果你的矩阵非常大,你可以考虑使用稀疏矩阵,但原理是相同的。
说明 :
对于任何边,A [i,j],该边的反转是A [j,i]。 A [j,i]与A.transpose()[i,j]相同。 因此,如果反转每条边的方向,则A.transpose()是图形的邻接矩阵。 〜运算符等同于np.logical_not函数。 只要没有边缘,~A的值就是1。 您对“缺少连接”感兴趣,这些连接不在A中但在A.transpose()中。 您可以使用&运算符获取这些连接,该运算符等同于A.transpose()和〜A上的np.logical_and。
像这样的邻接矩阵应该是对称的。 如何取下三角形部分,将其移位并将其与上三角形部分进行比较? 像这样的东西:
low = tril(m).transpose()
upp = triu(m)
missing = mod(low + upp, 2)
如果上三角形部分缺少位置,则missing
应为1。
如果您只关心它确保上部是正确的,您可以执行以下操作:
m = tril(m).transpose() + tril(m)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.