JMQ*_*JMQ 4 algorithm r graph matrix igraph
A是存储为矩阵对象的邻接矩阵:
#1 2 3 4 5 6 7 8 9
A <- matrix(data=c( 0,0,1,1,0,0,0,1,0, #1
0,0,0,0,1,0,0,0,0, #2
1,0,0,0,0,0,0,0,0, #3
1,0,0,0,0,0,0,0,1, #4
0,1,0,0,0,1,0,0,0, #5
0,0,0,0,1,0,0,0,0, #6
0,0,0,0,0,0,0,0,0, #7
1,0,0,0,0,0,0,0,0, #8
0,0,0,1,0,0,0,0,0 ),#9
nrow=9, ncol=9)
Run Code Online (Sandbox Code Playgroud)
的图表A如下所示:
我正在尝试识别邻居的邻居,并创建一个新的邻接矩阵,其值捕获距给定节点仅一步之遥的N某个节点的邻居。ji
例如A,3是 的邻居1,是和1的邻居。但既不是邻居,也不是。在所需的邻接矩阵 中,我希望表示的行/列对于表示节点和 的列包含值 1 ,但不包含节点。解决方案矩阵应如下所示:48348N3481N
#1 2 3 4 5 6 7 8 9
N <- matrix(data=c( 0,0,0,0,0,0,0,0,1, #1
0,0,0,0,0,1,0,0,0, #2
0,0,0,1,0,0,0,1,0, #3
0,0,1,0,0,0,0,1,0, #4
0,0,0,0,0,0,0,0,0, #5
0,1,0,0,0,0,0,0,0, #6
0,0,0,0,0,0,0,0,0, #7
0,0,1,1,0,0,0,0,0, #8
1,0,0,0,0,0,0,0,0 ),#9
nrow=9, ncol=9)
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,这里是 中的邻居的邻居,A成为 中存储的信息N。
#1: 9
#2: 6
#3: 4, 8
#4: 8, 3
#5: -
#6: 2
#7: -
#8: 3, 4
#9: 1
Run Code Online (Sandbox Code Playgroud)
这篇文章提出了类似的问题,但使用了不同的语言,并且涉及稍微不同的解决方案。
注意:理想的解决方案将扩展到具有 100 个节点的网络并运行数万次,因此我希望有一个高效的解决方案。
您可以尝试使用下面的代码ego
g <- graph_from_adjacency_matrix(A, "undirected")
v <- rep(0, vcount(g))
N <- sapply(ego(g, order = 2, mindist = 2), function(k) replace(v, k, 1))
Run Code Online (Sandbox Code Playgroud)
你将获得
> N
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 0 0 0 0 0 0 0 1
[2,] 0 0 0 0 0 1 0 0 0
[3,] 0 0 0 1 0 0 0 1 0
[4,] 0 0 1 0 0 0 0 1 0
[5,] 0 0 0 0 0 0 0 0 0
[6,] 0 1 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0
[8,] 0 0 1 1 0 0 0 0 0
[9,] 1 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
或更紧凑的结果
> ego(g, order = 2, mindist = 2)
[[1]]
+ 1/9 vertex, from da0d22c:
[1] 9
[[2]]
+ 1/9 vertex, from da0d22c:
[1] 6
[[3]]
+ 2/9 vertices, from da0d22c:
[1] 4 8
[[4]]
+ 2/9 vertices, from da0d22c:
[1] 3 8
[[5]]
+ 0/9 vertices, from da0d22c:
[[6]]
+ 1/9 vertex, from da0d22c:
[1] 2
[[7]]
+ 0/9 vertices, from da0d22c:
[[8]]
+ 2/9 vertices, from da0d22c:
[1] 3 4
[[9]]
+ 1/9 vertex, from da0d22c:
[1] 1
Run Code Online (Sandbox Code Playgroud)