如何在R中将&运算符应用于布尔矩阵?

时间:2019-01-29 10:12:47

标签: r

我有一个矩阵,例如

matrix(sample(c(T,F),12,replace=T),3,4 )

结果是

      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE  TRUE
[2,] FALSE  TRUE  TRUE  TRUE
[3,]  TRUE FALSE FALSE FALSE

我正在寻找将AND (&)运算符应用于所有矩阵的最短方法。因此,如果存在FALSE,则输出也应为 false

我知道循环是如何工作的,但是我正在寻找更短的解决方案

2 个答案:

答案 0 :(得分:2)

对于任何矩阵m

> m
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE  TRUE  TRUE  TRUE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE  TRUE

c(m)将把矩阵展平为向量:

> c(m)
 [1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE

因此,要使所有元素的AND为TRUE,则必须使所有元素为TRUE。因此:

> all(c(m))
[1] FALSE

在这种情况下,您可以省略c并直接执行:

> all(m)
[1] FALSE

在更一般的情况下,您可以将函数应用于带有Reduce的向量的元素对,例如:

> Reduce("&", c(m))
[1] FALSE

返回m[1,1] & m[1,2] & m[1,3] ... & m[3,4]-或可能以其他顺序返回。但是all更快。

答案 1 :(得分:0)

m <- matrix(sample(c(T,F),12,replace=T),3,4 )
!sum(!m)

事实上,all(m)是最快的方法。

library(microbenchmark)

m <- matrix(sample(c(T, F), 12, replace = T), 3, 4)
v1 <- c(rep(TRUE, 100000), FALSE)
v2 <- c(rep(FALSE, 100000), TRUE)
microbenchmark(all(m),
!sum(!m),
Reduce("&", c(m))
)
#> Unit: nanoseconds
#>               expr   min      lq     mean  median      uq   max neval
#>             all(m)   180   196.5   321.95   307.0   390.0  2009   100
#>           !sum(!m)   480   568.0   872.71   743.5   961.5  7310   100
#>  Reduce("&", c(m)) 11811 12552.0 13773.78 12785.5 13324.5 60542   100
microbenchmark(all(v1),
               !sum(!v1),
               Reduce("&", c(v1))
)
#> Unit: microseconds
#>                expr       min         lq       mean     median         uq
#>             all(v1)   182.243   182.7665   194.1427   191.5655   197.4315
#>           !sum(!v1)   222.820   229.6120   252.6130   241.8500   270.7170
#>  Reduce("&", c(v1)) 49630.995 50749.8915 52422.5430 52030.7920 53034.9625
#>        max neval
#>    250.658   100
#>    365.297   100
#>  84738.200   100
microbenchmark(all(v2),
               !sum(!v2),
               Reduce("&", c(v2))
)
#> Unit: nanoseconds
#>                expr      min         lq        mean     median       uq
#>             all(v2)      180      275.0     1416.92      396.0     3213
#>           !sum(!v2)   223276   227139.5   253327.79   259543.5   273641
#>  Reduce("&", c(v2)) 47403495 50349576.5 51972709.38 51785602.5 52767908
#>       max neval
#>      8929   100
#>    342353   100
#>  85463431   100