【发布时间】:2015-04-24 21:00:52
【问题描述】:
我有一个根据理论应该是对称的矩阵,但在我的数据中可能不会被观察为对称的。我想通过使用两个比较单元中的最大值来强制它是对称的。
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
使用双循环很容易做到这一点。
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
但是我的矩阵大于 $3x3$,并且 R 的循环问题有据可查。我也有兴趣使我的代码尽可能干净。事实上,我曾考虑将其放在 code golf 上,但这是我认为其他人可能会感兴趣的真正问题。
我见过this one 和this one,但我的不同之处在于,这些运算似乎实际上有一个只需要重新排序的对称矩阵,而且我有一个需要更改为对称的矩阵.
【问题讨论】:
-
我以前见过,但似乎答案通常涉及机器精度或近对称矩阵。在我的情况下,应该相等的单元格可能完全不同。我认为答案不适用,尽管问题可能相似。
-
我基本同意,但如果您向下滚动,看起来 BondedDust 的好答案与我自己的相似。我也喜欢使用
pmean()(代替pmax())的想法,这可能会更好,具体取决于矩阵不对称的原因。 (Link here,因为之前的评论现已被删除。) -
顺便说一句,关于“循环问题有据可查”:我也听说过一些历史理由,但在过去几年里,相当多 循环性能和行为的改进。你有最近的和可重复的指标吗? (我不是在戳,我是真的很好奇!)