将矩阵转换为对称矩阵,且对角线上的元素为0。

3
我有一个如下的矩阵;
   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来维护对称矩阵。
3个回答

5

使用逻辑运算符

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

@chinsoon12的建议非常好。

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

1
也许可以通过 +(mat | t(mat)) 来节省一个字符。 - chinsoon12
1
太好了,@Suren。这是解决我的问题的非常简短的方法。 - Anu

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

1
怎么样:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接