从用 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
我有一个这样的矩阵:
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