【问题标题】:How to convert a symmetric matrix in an adjacency list?如何转换邻接表中的对称矩阵?
【发布时间】:2015-02-18 01:46:20
【问题描述】:

我想知道从 R 中的邻接矩阵创建邻接列表的最快方法是什么。我目前正在使用 for-for 方法,但由于我必须处理大矩阵,因此最快的方法会有所帮助.

一个示例矩阵:

  A B C D
A 1 2 3 4
B 2 1 2 3
C 3 2 1 2
D 4 3 2 1

预期的邻接列表:

A B 2
A C 3 
A D 4
B C 2
B D 3
C D 2

以下是涵盖我当前代码的testthat 测试:

test_that("Matrix to List", {
  mat <- matrix(c(1,2,3,4,
                  2,1,2,3,
                  3,2,1,2,
                  4,3,2,1), ncol=4)
  colnames(mat) <- rownames(mat) <- letters[1:4]
  adj <- matrixToAdjacencyList(mat)
  expected <- data.frame(Columns=c("a", "a", "a", "b", "b", "c"),
                            Rows=c("b", "c", "d", "c", "d", "d"),
                           Value=c(2,3,4,2,3,2))
  expect_identical(adj, expected)
})

非常感谢。

【问题讨论】:

    标签: r algorithm matrix


    【解决方案1】:

    您可以将matrix 视为table 并使用data.frame 方法。

    mat[lower.tri(mat, diag = TRUE)] <- NA
    na.omit(data.frame(as.table(mat)))
    #    Var1 Var2 Freq
    # 5     A    B    2
    # 9     A    C    3
    # 10    B    C    2
    # 13    A    D    4
    # 14    B    D    3
    # 15    C    D    2
    

    从这里开始,只需清理您的 dimnames 并重新排序您的输出,以获得您想要的 testthat 的确切输出。

    (或者,在第一行使用upper.tri而不是lower.tri,然后将列顺序更改为c(2, 1, 3)以获得正确的顺序--可能比订购多行更有效。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多