5

我有一个 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 
}

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

非常感谢您的关注。

4

1 回答 1

5

这应该有效:

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

或在一个(平衡的)声明中:

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

这种索引形式通常称为矩阵索引。这是?"["文档中的相关部分:

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

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

于 2013-07-29T13:29:31.323 回答