我在R中有一个应该是对称的矩阵,但是,由于机器精度,矩阵永远不对称(值相差大约10 ^ -16).因为我知道矩阵是对称的,所以到目前为止我一直在这样做以解决这个问题:
s.diag = diag(s)
s[lower.tri(s,diag=T)] = 0
s = s + t(s) + diag(s.diag,S)
Run Code Online (Sandbox Code Playgroud)
有一个更好的一行命令吗?
我有一个矩阵,根据理论应该是对称的,但在我的数据中可能不会被观察为对称的.我想通过使用两个比较单元格的最大值来强制这是对称的.
test_matrix <- matrix(c(0,1,2,1,0,1,1.5,1,0), nrow = 3)
test_matrix
#> [,1] [,2] [,3]
#>[1,] 0 1 1.5
#>[2,] 1 0 1.0
#>[3,] 2 1 0.0
Run Code Online (Sandbox Code Playgroud)
使用双循环很容易做到这一点.
for(i in 1:3){
for(j in 1:3){
test_matrix[i, j] <- max(test_matrix[i, j], test_matrix[j, i])
}
}
test_matrix
#> [,1] [,2] [,3]
#> [1,] 0 1 2
#> [2,] 1 0 1
#> [3,] 2 1 0
Run Code Online (Sandbox Code Playgroud)
但是我的矩阵大于$ 3x3 $,并且R的循环问题已被充分记录.我也有兴趣让我的代码尽可能干净.事实上,我考虑将其放在代码高尔夫上,但这是一个我认为其他人可能感兴趣的真正问题.
我已经看过这一个以及这一个,但我的不同之处在于那些操作似乎实际上有一个只需要重新排序的对称矩阵,而且我有一个矩阵需要改变为对称.