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 中有什么有效的方法吗?
编辑:第一行的第 2 和第 3 列为 1,第一列的第 3 行为 1。但是要具有对称的第一列也需要在第二行中有 1 个。同样,每行和每列都应考虑 1 以维护对称矩阵。
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
使用逻辑运算
sym_mat <- (mat | t(mat)) * 1
@chinsoon12的建议很好
sym_mat <- +(mat | t(mat))
怎么样:
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
我有一个矩阵如下;
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 中有什么有效的方法吗?
编辑:第一行的第 2 和第 3 列为 1,第一列的第 3 行为 1。但是要具有对称的第一列也需要在第二行中有 1 个。同样,每行和每列都应考虑 1 以维护对称矩阵。
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
使用逻辑运算
sym_mat <- (mat | t(mat)) * 1
@chinsoon12的建议很好
sym_mat <- +(mat | t(mat))
怎么样:
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