繁体   English   中英

R:将矩阵转换为对角线0的对称矩阵

[英]R : convert a matrix to symmetric matrix with diagonal 0

我有一个矩阵如下;

   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来维持对称矩阵。

使用逻辑运算

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

@ chinsoon12的建议很不错。

sym_mat <- +(mat | t(mat))
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

怎么样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM