【问题标题】:R better way to replace matrix elements with zeroes in symetric matrixR在对称矩阵中用零替换矩阵元素的更好方法
【发布时间】:2013-07-29 07:36:47
【问题描述】:

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

这可以解决问题,但我想知道是否有更好、更有效的方法来使用类似应用的函数进行编码。

非常感谢您的关注。

【问题讨论】:

    标签: r matrix replace


    【解决方案1】:

    这应该可行:

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

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

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

    这种索引形式通常被称为矩阵索引。以下是来自?"[" doc 的相关部分:

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

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

    【讨论】:

    • 非常感谢。您的代码传达了 R 的简洁和优雅。它在第一个实例中不起作用,因为我的 Y 是一个数据框。用 X[rbind(as.matrix(Y[, 1:2]), as.matrix(Y, 2:1]))] 求解
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2017-05-09
    • 2016-11-13
    • 1970-01-01
    • 2023-04-08
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多