我有一个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
}
这是诀窍,但我想知道是否有一种更好,更有效的方法来使用类似应用的函数来编写代码。
非常感谢你的关注。
答案 0 :(得分:5)
这应该有效:
X[Y] <- 0
X[Y[, 2:1]] <- 0
或在一个(平衡的)陈述中:
X[rbind(Y[, 1:2],
Y[, 2:1])] <- 0
这种索引形式通常称为矩阵索引。以下是?"["
doc:
第三种索引形式是通过数字矩阵,每个维度都有一列:索引矩阵的每一行然后选择数组的单个元素,结果是一个向量。 [...]
这比任何类型的循环都要快,包括*apply
函数。