问题描述
我创建了一个描述图的矩阵S
。看起来像这样:
[,1] [,2] [,3]
1 2 3 9
2 1 10 5
3 9 4 8
4 3 9 7
5 10 4 11
6 11 5 10
7 4 3 8
8 9 3 4
9 3 8 4
10 5 2 11
11 6 5 10
这意味着第3个顶点与第9个,第4个和第8个顶点相连。我的图没有方向。我想创建一个邻接矩阵。例如,第三行是:
[1,1,0]
我考虑过创建一个零为11x11的矩阵,并逐行对其进行分析。我的结果矩阵应该是对称的。但是我不能使用任何循环,“ for”是禁止的。我是数学家,并且对R完全陌生。我应该如何开始解决这个问题?
数据
S <- structure(c(2L,1L,9L,3L,10L,11L,4L,5L,6L,8L,2L,7L,10L),.Dim = c(11L,3L))
解决方法
我认为您可以尝试以下基本R代码
v <- rep(0,nrow(S))
C <- t(apply(S,1,function(k) replace(v,k,1)))
res <- +(t(C) + C >0)
将邻接矩阵设为
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 1 1 0 0 0 0 0 1 0 0
[2,] 1 0 0 0 1 0 0 0 0 1 0
[3,] 1 0 0 1 0 0 1 1 1 0 0
[4,] 0 0 1 0 1 0 1 1 1 0 0
[5,] 0 1 0 1 0 1 0 0 0 1 1
[6,] 0 0 0 0 1 0 0 0 0 1 1
[7,] 0 0 1 1 0 0 0 1 0 0 0
[8,] 0 0 1 1 0 0 1 0 1 0 0
[9,] 1 0 1 1 0 0 0 1 0 0 0
[10,] 0 1 0 0 1 1 0 0 0 0 1
[11,] 0 0 0 0 1 1 0 0 0 1 0
如果您想使用igraph
,这是另一种选择
library(igraph)
df <- data.frame(from = rep(1:nrow(S),each = ncol(S)),to = c(t(S)))
res <- as_adjacency_matrix(
simplify(
graph_from_data_frame(
df,directed = FALSE
)
),sparse = FALSE
)
给出
1 2 3 4 5 6 7 8 9 10 11
1 0 1 1 0 0 0 0 0 1 0 0
2 1 0 0 0 1 0 0 0 0 1 0
3 1 0 0 1 0 0 1 1 1 0 0
4 0 0 1 0 1 0 1 1 1 0 0
5 0 1 0 1 0 1 0 0 0 1 1
6 0 0 0 0 1 0 0 0 0 1 1
7 0 0 1 1 0 0 0 1 0 0 0
8 0 0 1 1 0 0 1 0 1 0 0
9 1 0 1 1 0 0 0 1 0 0 0
10 0 1 0 0 1 1 0 0 0 0 1
11 0 0 0 0 1 1 0 0 0 1 0
,
这是分配了row/column
的选项
m1 <- matrix(0,nrow = nrow(S),ncol = max(S))
m1[cbind(rep(seq_len(nrow(S)),c(t(S)))] <- 1
+(m1|t(m1))
-输出
# [,11]
# [1,] 0 1 1 0 0 0 0 0 1 0 0
# [2,] 1 0 0 0 1 0 0 0 0 1 0
# [3,] 1 0 0 1 0 0 1 1 1 0 0
# [4,] 0 0 1 0 1 0 1 1 1 0 0
# [5,] 0 1 0 1 0 1 0 0 0 1 1
# [6,] 0 0 0 0 1 0 0 0 0 1 1
# [7,] 0 0 1 1 0 0 0 1 0 0 0
# [8,] 0 0 1 1 0 0 1 0 1 0 0
# [9,] 1 0 1 1 0 0 0 1 0 0 0
#[10,] 0 1 0 0 1 1 0 0 0 0 1
#[11,] 0 0 0 0 1 1 0 0 0 1 0
数据
S <- structure(c(2L,1L,9L,3L,10L,11L,4L,5L,6L,8L,2L,7L,10L),.Dim = c(11L,3L))