R - 找到邻居的邻居并将它们存储在唯一的邻接矩阵中

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

例如A3是 的邻居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 个节点的网络并运行数万次,因此我希望有一个高效的解决方案。

Tho*_*ing 5

您可以尝试使用下面的代码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)