【问题标题】:R : convert a matrix to symmetric matrix with diagonal 0R:将矩阵转换为对角线为 0 的对称矩阵
【发布时间】:2018-04-09 02:15:27
【问题描述】:

我有一个矩阵如下;

   1  2  3  4  5  
1  0  1  1  0  0  
2  0  0  1  1  0  
3  1  0  0  0  1  
4  0  0  1  0  0   
5  0  1  0  0  0  

我需要得到对称矩阵如下,对角线为0;

   1  2  3  4  5  
1  0  1  1  0  0  
2  1  0  1  1  1  
3  1  1  0  1  1  
4  0  1  1  0  0   
5  0  1  1  0  0  

我用for循环试过了,当矩阵很小的时候很好。但是对于大尺寸,这需要时间。在 R 中有什么有效的方法吗?

编辑:第一行在第二和第三列有 1,第一列在第三行有 1。但是要具有对称的第一列也需要在第二行中有 1 个。同样,每一行和每一列都应该考虑 1 来保持对称矩阵。

【问题讨论】:

    标签: r matrix symmetric


    【解决方案1】:

    使用逻辑运算

    sym_mat <- (mat | t(mat)) * 1
    

    @chinsoon12 的建议很不错。

    sym_mat <- +(mat | t(mat))
    

    【讨论】:

    • 也许可以用+(mat | t(mat))多保存一个字符
    • 伟大的@Suren。这是解决我的问题的非常短的方法。
    【解决方案2】:
    mat=read.table(text="   1  2  3  4  5  
    1  0  1  1  0  0  
               2  0  0  1  1  0  
               3  1  0  0  0  1  
               4  0  0  1  0  0   
               5  0  1  0  0  0  ")
    
    mat=as.matrix(mat)
    m=ifelse(!t(mat)[lower.tri(mat)], mat[lower.tri(mat)], t(mat)[lower.tri(mat)])
    mat[lower.tri(mat)]=m
    mat[upper.tri(mat)]=t(mat)[upper.tri(mat)]
    
    
     mat
      X1 X2 X3 X4 X5
    1  0  1  1  0  0
    2  1  0  1  1  1
    3  1  1  0  1  1
    4  0  1  1  0  0
    5  0  1  1  0  0
    

    【讨论】:

      【解决方案3】:

      怎么样:

      myTrues <- which(mat == 1, arr.ind = T)
      mat[rbind(myTrues, myTrues[,c(2,1)])] <- 1L
      
      mat
           [,1] [,2] [,3] [,4] [,5]
      [1,]    0    1    1    0    0
      [2,]    1    0    1    1    1
      [3,]    1    1    0    1    1
      [4,]    0    1    1    0    0
      [5,]    0    1    1    0    0
      

      【讨论】:

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