graph_from_adjacency_matrix()
是一个灵活的函数,用于从邻接矩阵创建 igraph
图。
用法
graph_from_adjacency_matrix(
adjmatrix,
mode = c("directed", "undirected", "max", "min", "upper", "lower", "plus"),
weighted = NULL,
diag = TRUE,
add.colnames = NULL,
add.rownames = NA
)
from_adjacency(...)
参数
- adjmatrix
一个方形邻接矩阵。从igraph版本0.5.1开始,这可以是一个使用
Matrix
包创建的稀疏矩阵。- mode
字符标量,指定igraph应如何解释提供的矩阵。另请参阅
weighted
参数,解释也取决于它。可能的值有:directed
、undirected
、upper
、lower
、max
、min
、plus
。请参阅下面的详细信息。- weighted
此参数指定是否从邻接矩阵创建加权图。如果它是
NULL
,则创建一个未加权的图,并且邻接矩阵的元素给出顶点之间的边数。如果它是一个字符常量,那么对于每个非零矩阵条目,都将创建一个边,并且该条目的值将作为边属性添加,并由weighted
参数命名。如果它是TRUE
,则创建一个加权图,并且边属性的名称将为weight
。另请参阅下面的详细信息。- diag
逻辑标量,是否在计算中包含矩阵的对角线。如果这是
FALSE
,则首先将对角线置零。- add.colnames
字符标量,是否将列名添加为顶点属性。如果它是“
NULL
”(默认值),则如果存在,列名将作为顶点属性“name”添加。 如果“NA
”,则不会添加它们。 如果是一个字符常量,则它给出了要添加的顶点属性的名称。- add.rownames
字符标量,是否将行名添加为顶点属性。 可能的值与前一个参数相同。 默认情况下,不添加行名。 如果“
add.rownames
”和“add.colnames
”指定相同的顶点属性,则忽略前者。- ...
传递给
graph_from_adjacency_matrix()
。
详细信息
顶点的顺序被保留,即对应于第一行的顶点将是图中的顶点 0,依此类推。
graph_from_adjacency_matrix()
在两种主要模式下运行,具体取决于 weighted
参数。
如果此参数为 NULL
,则创建一个未加权图,并且邻接矩阵的一个元素给出要在两个对应顶点之间创建的边数。 详细信息取决于 mode
参数的值
- “directed”
该图将是有向图,并且矩阵元素给出两个顶点之间的边数。
- “undirected”
为了方便起见,这与
max
完全相同。 请注意,不会检查矩阵是否对称。- “max”
将创建一个无向图,并且
max(A(i,j), A(j,i))
给出边数。- “upper”
将创建一个无向图,只有右上三角形(包括对角线)用于边数。
- “lower”
将创建一个无向图,只有左下三角形(包括对角线)用于创建边。
- “min”
将创建一个无向图,顶点
i
和j
之间有min(A(i,j), A(j,i))
条边。- “plus”
将创建一个无向图,顶点
i
和j
之间有A(i,j)+A(j,i)
条边。
如果 weighted
参数不是 NULL
,则矩阵的元素给出边的权重(如果它们不为零)。 详细信息取决于 mode
参数的值
- “directed”
该图将是有向图,并且矩阵元素给出边权重。
- “undirected”
首先我们检查矩阵是否对称。 如果不是,则会出错。 然后,只有上三角形用于创建加权无向图。
- “max”
将创建一个无向图,并且
max(A(i,j), A(j,i))
给出边权重。- “upper”
将创建一个无向图,只有右上三角形(包括对角线)被使用(用于边权重)。
- “lower”
将创建一个无向图,只有左下三角形(包括对角线)用于创建边。
- “min”
将创建一个无向图,
min(A(i,j), A(j,i))
给出边权重。- “plus”
将创建一个无向图,
A(i,j)+A(j,i)
给出边权重。
参见
make_graph()
和 graph_from_literal()
用于创建图的其他方式。
作者
Gabor Csardi csardi.gabor@gmail.com
示例
g1 <- sample(
x = 0:1, size = 100, replace = TRUE,
prob = c(0.9, 0.1)
) %>%
matrix(ncol = 10) %>%
graph_from_adjacency_matrix()
g2 <- sample(
x = 0:5, size = 100, replace = TRUE,
prob = c(0.9, 0.02, 0.02, 0.02, 0.02, 0.02)
) %>%
matrix(ncol = 10) %>%
graph_from_adjacency_matrix(weighted = TRUE)
E(g2)$weight
#> [1] 4 3 2 2 2 4 2 5 2 2 2 2
## various modes for weighted graphs, with some tests
non_zero_sort <- function(x) sort(x[x != 0])
adj_matrix <- matrix(runif(100), 10)
adj_matrix[adj_matrix < 0.5] <- 0
g3 <- graph_from_adjacency_matrix(
(adj_matrix + t(adj_matrix)) / 2,
weighted = TRUE,
mode = "undirected"
)
g4 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "max"
)
expected_g4_weights <- non_zero_sort(
pmax(adj_matrix, t(adj_matrix))[upper.tri(adj_matrix, diag = TRUE)]
)
actual_g4_weights <- sort(E(g4)$weight)
all(expected_g4_weights == actual_g4_weights)
#> [1] TRUE
g5 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "min"
)
expected_g5_weights <- non_zero_sort(
pmin(adj_matrix, t(adj_matrix))[upper.tri(adj_matrix, diag = TRUE)]
)
actual_g5_weights <- sort(E(g5)$weight)
all(expected_g5_weights == actual_g5_weights)
#> [1] TRUE
g6 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "upper"
)
expected_g6_weights <- non_zero_sort(adj_matrix[upper.tri(adj_matrix, diag = TRUE)])
actual_g6_weights <- sort(E(g6)$weight)
all(expected_g6_weights == actual_g6_weights)
#> [1] TRUE
g7 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "lower"
)
expected_g7_weights <- non_zero_sort(adj_matrix[lower.tri(adj_matrix, diag = TRUE)])
actual_g7_weights <- sort(E(g7)$weight)
all(expected_g7_weights == actual_g7_weights)
#> [1] TRUE
g8 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "plus"
)
halve_diag <- function(x) {
diag(x) <- diag(x) / 2
x
}
expected_g8_weights <- non_zero_sort(
halve_diag(adj_matrix + t(adj_matrix))[lower.tri(adj_matrix, diag = TRUE)]
)
actual_g8_weights <- sort(E(g8)$weight)
all(expected_g8_weights == actual_g8_weights)
#> [1] TRUE
g9 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
mode = "plus",
diag = FALSE
)
zero_diag <- function(x) {
diag(x) <- 0
}
expected_g9_weights <- non_zero_sort((zero_diag(adj_matrix + t(adj_matrix)))[lower.tri(adj_matrix)])
actual_g9_weights <- sort(E(g9)$weight)
all(expected_g9_weights == actual_g9_weights)
#> [1] TRUE
## row/column names
rownames(adj_matrix) <- sample(letters, nrow(adj_matrix))
colnames(adj_matrix) <- seq(ncol(adj_matrix))
g10 <- graph_from_adjacency_matrix(
adj_matrix,
weighted = TRUE,
add.rownames = "code"
)
summary(g10)
#> IGRAPH af08bd5 DNW- 10 51 --
#> + attr: name (v/c), code (v/c), weight (e/n)