从用 R 表示图的矩阵构造邻接矩阵

Construct an adjency matrix from a matrix that represents a graph with R

我有一个这样的矩阵:


1 0 1 0 1 1
1 1 1 0 0 1
1 0 1 1 1 1
0 0 0 1 0 0
0 1 1 1 0 1
1 1 0 1 1 1

其中 1 表示一个节点,0 表示没有节点,例如,从 (1, 1) 我们可以转到 (2, 1),从 (2, 1) 我们可以转到 ( 3, 1) 或 (2, 2) 等等。

该图是无向的,所有边的成本都相同(只说成本为 1)

所以我们总共有 23 个节点,所以邻接矩阵应该是一个 23 x 23 的矩阵,其中 1 告诉我们两个节点是连接的。

有什么方法可以使用 R 将此矩阵转换为图形的邻接矩阵吗?

创建一个数据框,矩阵的每个条目一行,对应的行号和列号,然后将该数据框子集化为条目 1。(@Andrew Gustar 删除了他的 post 但post 表明 d 的 row 和 col 列也可以表示为 d <- as.data.frame(which(m == 1, arr.ind = TRUE)) )。现在使用 outer 来确定该数据框的两行是否代表相邻节点。如果节点可以与自身相邻,则将设置 adj 的行中的 ==1 更改为 <=1。

d <- data.frame(value = c(m), row = c(row(m)), col = c(col(m))) |>
  subset(value == 1)
adj <- +with(d, abs(outer(row, row, `-`)) + abs(outer(col, col, `-`)) == 1)

我们可以通过将其转换为稀疏矩阵来轻松查看邻接矩阵。

Matrix::Matrix(adj)

给予:

23 x 23 sparse Matrix of class "dsCMatrix"   
                                            
 [1,] . 1 . . . . . . . . . . . . . . . . . . . . .
 [2,] 1 . 1 . 1 . . . . . . . . . . . . . . . . . .
 [3,] . 1 . . . . . . . . . . . . . . . . . . . . .
 [4,] . . . . . . 1 . . . . . . . . . . . . . . . .
 [5,] . 1 . . . . . . 1 . . . . . . . . . . . . . .
 [6,] . . . . . . 1 . . . 1 . . . . . . . . . . . .
 [7,] . . . 1 . 1 . . . . . . . . . . . . . . . . .
 [8,] . . . . . . . . 1 . . . . . . . . . . . . . .
 [9,] . . . . 1 . . 1 . 1 . . . . . . . . . . . . .
[10,] . . . . . . . . 1 . . 1 . . . . . . . . . . .
[11,] . . . . . 1 . . . . . . . 1 . . . . . . . . .
[12,] . . . . . . . . . 1 . . 1 . . . 1 . . . . . .
[13,] . . . . . . . . . . . 1 . 1 . . . . . . . . .
[14,] . . . . . . . . . . 1 . 1 . 1 . . . . . . . .
[15,] . . . . . . . . . . . . . 1 . . . 1 . . . . .
[16,] . . . . . . . . . . . . . . . . . . 1 . . . .
[17,] . . . . . . . . . . . 1 . . . . . . . . 1 . .
[18,] . . . . . . . . . . . . . . 1 . . . . . . . 1
[19,] . . . . . . . . . . . . . . . 1 . . . 1 . . .
[20,] . . . . . . . . . . . . . . . . . . 1 . 1 . .
[21,] . . . . . . . . . . . . . . . . 1 . . 1 . . .
[22,] . . . . . . . . . . . . . . . . . . . . . . 1
[23,] . . . . . . . . . . . . . . . . . 1 . . . 1 .

我们可以使用 igraph 来绘制图形:

library(igraph)

set.seed(123)
g <- graph.adjacency(adj, mode = "undirected")
plot(g, vertex.color = "white", vertex.size = 10, vertex.label.cex = 0.7)

备注

m <- structure(c(1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 
0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1), .Dim = c(6L, 
6L), .Dimnames = list(NULL, NULL))

我们可以试试这个

v <- c(row(m) * m + 1i * col(m) * m)[m > 0]
d <- +(abs(outer(v, v, `-`)) == 1)

这给出了

> d
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
 [1,]    0    1    0    0    0    0    0    0    0     0     0     0     0
 [2,]    1    0    1    0    1    0    0    0    0     0     0     0     0
 [3,]    0    1    0    0    0    0    0    0    0     0     0     0     0
 [4,]    0    0    0    0    0    0    1    0    0     0     0     0     0
 [5,]    0    1    0    0    0    0    0    0    1     0     0     0     0
 [6,]    0    0    0    0    0    0    1    0    0     0     1     0     0
 [7,]    0    0    0    1    0    1    0    0    0     0     0     0     0
 [8,]    0    0    0    0    0    0    0    0    1     0     0     0     0
 [9,]    0    0    0    0    1    0    0    1    0     1     0     0     0
[10,]    0    0    0    0    0    0    0    0    1     0     0     1     0
[11,]    0    0    0    0    0    1    0    0    0     0     0     0     0
[12,]    0    0    0    0    0    0    0    0    0     1     0     0     1
[13,]    0    0    0    0    0    0    0    0    0     0     0     1     0
[14,]    0    0    0    0    0    0    0    0    0     0     1     0     1
[15,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[16,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[17,]    0    0    0    0    0    0    0    0    0     0     0     1     0
[18,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[19,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[20,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[21,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[22,]    0    0    0    0    0    0    0    0    0     0     0     0     0
[23,]    0    0    0    0    0    0    0    0    0     0     0     0     0
      [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
 [1,]     0     0     0     0     0     0     0     0     0     0
 [2,]     0     0     0     0     0     0     0     0     0     0
 [3,]     0     0     0     0     0     0     0     0     0     0
 [4,]     0     0     0     0     0     0     0     0     0     0
 [5,]     0     0     0     0     0     0     0     0     0     0
 [6,]     0     0     0     0     0     0     0     0     0     0
 [7,]     0     0     0     0     0     0     0     0     0     0
 [8,]     0     0     0     0     0     0     0     0     0     0
 [9,]     0     0     0     0     0     0     0     0     0     0
[10,]     0     0     0     0     0     0     0     0     0     0
[11,]     1     0     0     0     0     0     0     0     0     0
[12,]     0     0     0     1     0     0     0     0     0     0
[13,]     1     0     0     0     0     0     0     0     0     0
[14,]     0     1     0     0     0     0     0     0     0     0
[15,]     1     0     0     0     1     0     0     0     0     0
[16,]     0     0     0     0     0     1     0     0     0     0
[17,]     0     0     0     0     0     0     0     1     0     0
[18,]     0     1     0     0     0     0     0     0     0     1
[19,]     0     0     1     0     0     0     1     0     0     0
[20,]     0     0     0     0     0     1     0     1     0     0
[21,]     0     0     0     1     0     0     1     0     0     0
[22,]     0     0     0     0     0     0     0     0     0     1
[23,]     0     0     0     0     1     0     0     0     1     0