【问题标题】:How to check if each value in a matrix is between the corresponding values in two other matrices in R?如何检查矩阵中的每个值是否介于 R 中其他两个矩阵的对应值之间?
【发布时间】:2018-05-13 23:34:33
【问题描述】:

我有一个矩阵,我想将它与其他两个矩阵进行比较,以查看矩阵中的每个条目是包含在其他两个矩阵的值内还是在值之外。例如,如果我的矩阵是:

> M
           [,1]       [,2]       [,3]
[1,] -0.1278982  0.4600544  1.3271033
[2,] -0.1079272  1.2196851 -0.5240536 
[3,]  0.9548449 -0.9979668 -0.6636296 

另外两个矩阵是 L 和 U:

> L 
            [,1]      [,2]       [,3]
[1,] -0.49416022 1.0992247 -1.2834469
[2,]  0.35491793 0.2460946  1.1411529
[3,]  0.01755317 0.2469062  0.2843848

> U
            [,1]       [,2]        [,3]
[1,] -0.84996737  1.0036554 -0.04747612
[2,]  0.35396050 -0.4612527 -1.47341334
[3,] -0.07716839 -1.5921625  1.62187501

我想取M的每一个条目,比较一下是否包含在L和U对应条目的范围内。

例如,对于 M[1,1],它超出了 -0.49416022 和 -0.84996737 的范围,因此我将为此比较分配值 0。另一方面,对于 M[2,3] ,值为 -0.5240536,因此介于 1.1411529 和 -1.47341334 之间,因此此比较的值为 0。

最终,我想获得一个全0和1的矩阵,指示M中的条目是否包含在L和U的对应值中。例如,如果我们将此矩阵称为M_comparisons,那么:

> M_comparisons
            [,1]      [,2]       [,3]
[1,]           0         0          0
[2,]           0         0          1
[3,]           0         1          0

有没有人知道如何在非常快的计算时间内为大型矩阵做到这一点?谢谢!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    就这么简单:

    (M > U & M < L)*1
    
    #     [,1] [,2] [,3]
    #[1,]    0    0    0
    #[2,]    0    0    1
    #[3,]    0    1    0
    

    或者,正如 Rui Barradas 所建议的(稍微快一点):

    as.integer(M > U & M < L)
    

    基准测试

    library(microbenchmark)
    
    microbenchmark(
      (M > U & M < L)*1,
      as.integer(M > U & M < L)
    )
    
    #Unit: microseconds
    #                      expr   min    lq    mean median     uq    max neval
    #       (M > U & M < L) * 1 1.278 1.469 2.15965  1.640 1.8000 38.981   100
    # as.integer(M > U & M < L) 1.042 1.212 1.59757  1.384 1.5375 12.008   100
    

    样本数据

    M <- t(matrix(c(-0.1278982, 0.4600544, 1.3271033, 
                    -0.1079272, 1.2196851, -0.5240536,
                     0.9548449, -0.9979668, -0.6636296), nrow = 3))
    L <- t(matrix(c(-0.49416022, 1.0992247, -1.2834469, 
                     0.35491793, 0.2460946,  1.1411529, 
                     0.01755317, 0.2469062,  0.284384), nrow = 3))
    U <- t(matrix(c(-0.84996737, 1.0036554, -0.04747612, 
                     0.35396050, -0.4612527, -1.47341334, 
                    -0.07716839, -1.5921625, 1.6218750), nrow = 3))
    

    【讨论】:

    • 点赞,但as.integer(M &gt; U &amp; M &lt; L) 稍快。
    【解决方案2】:

    或者另一种方式是

    +(M > U & M < L)
    

    【讨论】:

    • 它将逻辑强制转换为二进制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多