如何在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

我正在寻找将CCD_ 1算子应用于全矩阵的最短方法。因此,如果存在FALSE,则输出也应为false

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

对于任何矩阵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

因此,所有元素的"与"为真,所有元素都必须为真。因此:

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

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

> all(m)
[1] FALSE

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

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

其返回CCD_ 7-或者可能以其它顺序返回。但all更快。

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

最新更新