Как применить & оператор к булевой матрице в R? - PullRequest
0 голосов
/ 29 января 2019

У меня есть матрица, такая как

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 голосов
/ 29 января 2019

Для любой матрицы 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

, который возвращает m[1,1] & m[1,2] & m[1,3] ... & m[3,4] - или, возможно, в другом порядке.Но all быстрее.

0 голосов
/ 29 января 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...