我有一个矩阵如下;
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来维持对称矩阵。
答案 0 :(得分:5)
使用逻辑操作
sym_mat <- (mat | t(mat)) * 1
@ chinsoon12&#39的建议非常好。
sym_mat <- +(mat | t(mat))
答案 1 :(得分: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
答案 2 :(得分: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