繁体   English   中英

找到邻接矩阵中所有缺失的有向边

[英]Find all the missing directed edges in an adjacency matrix

我使用numpy矩阵来表示有向图,如下所示:

0 0 0
1 0 1
1 0 0

给定这样的矩阵,我想找到所有缺失的有向边,其中存在相反方向的有向边。

例如,在上面的矩阵中,对于节点1 (索引0),在这个意义上缺少边缘1 -> 21 -> 3 ,因为在另一个方向上存在边缘2 -> 13 -> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM