【问题标题】:Making adjacency matrix from matrix indicating relations从表示关系的矩阵制作邻接矩阵
【发布时间】:2020-10-17 20:36:15
【问题描述】:

我创建了一个矩阵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,0,0,1,0,0,1,1,1,0,0]

我考虑过创建一个 11x11 的零矩阵并逐行分析它。我的结果矩阵应该是对称的。但是我不能使用任何循环,“for”是被禁止的。我是数学家,对 R 完全陌生。我应该如何开始解决这个问题?

数据

S <- structure(c(2L, 1L, 9L, 3L, 10L, 11L, 4L, 9L, 3L, 5L, 6L, 3L, 
10L, 4L, 9L, 4L, 5L, 3L, 3L, 8L, 2L, 5L, 9L, 5L, 8L, 7L, 11L,
10L, 8L, 4L, 4L, 11L, 10L), .Dim = c(11L, 3L))

【问题讨论】:

    标签: r matrix adjacency-matrix


    【解决方案1】:

    我想你可以试试下面的基本 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
    

    【讨论】:

    • 这个基本的 R 方法真的很棒!并且易于理解。这种到真/假矩阵的转换很聪明。谢谢
    【解决方案2】:

    这是一个带有row/column 分配的选项

    m1 <- matrix(0, nrow = nrow(S), ncol = max(S))
    m1[cbind(rep(seq_len(nrow(S)), each = ncol(S)), c(t(S)))] <- 1
    +(m1|t(m1))
    

    -输出

    #       [,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
    

    数据

    S <- structure(c(2L, 1L, 9L, 3L, 10L, 11L, 4L, 9L, 3L, 5L, 6L, 3L, 
    10L, 4L, 9L, 4L, 5L, 3L, 3L, 8L, 2L, 5L, 9L, 5L, 8L, 7L, 11L,
    10L, 8L, 4L, 4L, 11L, 10L), .Dim = c(11L, 3L))
    

    【讨论】:

    • 酷,更有效的赋值方法! +1
    • @ThomasIsCoding 谢谢。我只是从您出色的回答中得到了这个想法。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多