【问题标题】:Make a matrix symmetric使矩阵对称
【发布时间】: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 onethis one,但我的不同之处在于,这些运算似乎实际上有一个只需要重新排序的对称矩阵,而且我有一个需要更改为对称的矩阵.

【问题讨论】:

  • 我以前见过,但似乎答案通常涉及机器精度或近对称矩阵。在我的情况下,应该相等的单元格可能完全不同。我认为答案不适用,尽管问题可能相似。
  • 我基本同意,但如果您向下滚动,看起来 BondedDust 的好答案与我自己的相似。我也喜欢使用pmean()(代替pmax())的想法,这可能会更好,具体取决于矩阵不对称的原因。 (Link here,因为之前的评论现已被删除。)
  • 顺便说一句,关于“循环问题有据可查”:我也听说过一些历史理由,但在过去几年里,相当多 循环性能和行为的改进。你有最近的和可重复的指标吗? (我不是在戳,我是真的很好奇!)

标签: r matrix


【解决方案1】:

您可以使用pmax(),它返回一对向量的元素最大值。

pmax(test_matrix, t(test_matrix))
#      [,1] [,2] [,3]
# [1,]    0    1    2
# [2,]    1    0    1
# [3,]    2    1    0

它将与一对矩阵一起工作,就像这里一样,因为: (1) 在 R 中,矩阵是带有附加(维度)属性的“只是”向量; (2) 用于实现pmax() 的代码足以将其第一个参数的属性重新附加到它返回的值。

【讨论】:

  • 我以前从未见过pmax(),但现在我看到了它解决了我为之制定困难解决方法的各种问题。不错。
  • 如果矩阵很大(我的意思是真的很大),这种方法不会节省内存。在这些情况下,我更喜欢 OP 的解决方案。
  • @gregmacfarlane 和 JoshOBrien:问题中没有说明,但您可能需要检查方阵;一个非方阵仍然会做你想要的大部分,但没有任何警告或错误。
  • @RandyLai:也许Rcpp 解决方案会更好用?如果我处理足够大的矩阵(而且我经常这样做),它的糖不一定会更好地记忆(虽然有点),我可能会尝试迭代编译的变体。诚然,我认为我无法回答“有多大才成为问题”。
  • @r2evans。这取决于您如何使用RCpp。如果你写一个RCpp 函数,它等价于pmax(test_matrix, t(test_matrix)),那将毫无收获。当然,如果你在RCpp 中编写一个循环,它的作用与 OP 的代码相同,它会做得更好。
猜你喜欢
  • 2015-05-08
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-02-04
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多