使矩阵对称

gre*_*ane 3 r matrix

我有一个矩阵,根据理论应该是对称的,但在我的数据中可能不会被观察为对称的.我想通过使用两个比较单元格的最大值来强制这是对称的.

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的循环问题已被充分记录.我也有兴趣让我的代码尽可能干净.事实上,我考虑将其放在代码高尔夫上,但这是一个我认为其他人可能感兴趣的真正问题.

我已经看过这一个以及这一个,但我的不同之处在于那些操作似乎实际上有一个只需要重新排序的对称矩阵,而且我有一个矩阵需要改变为对称.

Jos*_*ien 8

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

pmax(test_matrix, t(test_matrix))
#      [,1] [,2] [,3]
# [1,]    0    1    2
# [2,]    1    0    1
# [3,]    2    1    0
Run Code Online (Sandbox Code Playgroud)

它将与一对矩阵一起使用,如下所示:因为:(1)在R中,矩阵是具有附加(维度)属性的"正义"向量; (2)用于实现的代码pmax()足以将其第一个参数的属性重新附加到它返回的值.