用对称矩阵中的零替换矩阵元素的更好方法

时间:2013-07-29 13:24:13

标签: r matrix replace

我有一个0对角线对称矩阵X,例如

          [1]        [2]       [3]        [4]        [5]    
[1]  0.00000000 0.07065048 0.1019865 0.23641082 0.23641082 
[2]  0.07065048 0.00000000 0.0000000 0.23641082 0.23641082 
[3]  0.10198654 0.00000000 0.0000000 0.00000000 0.23641082 
[4]  0.23641082 0.23641082 0.0000000 0.00000000 0.08870087 
[5]  0.23641082 0.23641082 0.2364108 0.08870087 0.00000000 

我需要根据第二个矩阵Y替换一些0的元素:

      [1]    [2]
[1]    3      2
[2]    4      3
[3]    1      2

因此X [3,2],X [4,3],X [1,2]和对称性的X [2,3],X [3,4],X [2,1]应该用零替换。

我提出了这个解决方案:

for (i in 1:nrow(Y)) {
  X[Y[i,1], Y[i,2]] <- 0
  X[Y[i,2], Y[i,1]] <- 0 
}

这是诀窍,但我想知道是否有一种更好,更有效的方法来使用类似应用的函数来编写代码。

非常感谢你的关注。

1 个答案:

答案 0 :(得分:5)

这应该有效:

X[Y] <- 0
X[Y[, 2:1]] <- 0

或在一个(平衡的)陈述中:

X[rbind(Y[, 1:2],
        Y[, 2:1])] <- 0

这种索引形式通常称为矩阵索引。以下是?"[" doc:

的相关部分
  

第三种索引形式是通过数字矩阵,每个维度都有一列:索引矩阵的每一行然后选择数组的单个元素,结果是一个向量。 [...]

这比任何类型的循环都要快,包括*apply函数。