我有一个矩阵,例如
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 。
我知道循环是如何工作的,但是我正在寻找更短的解决方案
答案 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