arrays - ¿Cuál es la diferencia entre Array{Bool} y BitArray en Julia y cómo se relacionan?
boolean (1)
Estaba escribiendo una función para arrays booleanos 2d:
function foo(A::Array{Bool,2})
...
end
Evaluando y probando con
A = randbool(3,3)
foo(A)
devoluciones
ERROR: ''foo'' has no method matching foo(::BitArray{2})
Obviamente, randbool()
genera un BitArray
, mientras que asumí que randbool()
generaría un Array{Bool}
.
¿Cómo se relacionan Array{Bool}
y BitArray
? ¿Por qué ambos existen?
¿Puedo escribir foo()
de tal manera que acepte ambos tipos de entrada usando un solo método (ya que no puedo ver una diferencia)?
Un Array{Bool}
almacena cada valor true/false
como un Bool
, que se representa internamente como un UInt8
. Entonces, si su matriz tiene N
elementos, tomará N
bytes para almacenarla.
Un BitArray
almacena cada valor true/false
como un solo bit, con (conceptualmente) 8 de ellos empaquetados en un solo UInt8
. En consecuencia, solo se necesitan N/8
bytes para almacenar la matriz. Un BitArray
también tiene métodos definidos que manejan todas las operaciones de manipulación de bits necesarias para usted.
Dependiendo de la operación, los BitArray
veces son más lentos que el Array{Bool}
y, a veces, más rápidos. Pero, en general, las diferencias de rendimiento son bastante pequeñas, por lo que tiene sentido usar BitArray
a menos que tenga una razón específica para no hacerlo. Pero en general son bastante intercambiables.
Tenga en cuenta que ambos son subtipos de AbstractArray{Bool}
:
julia> BitArray <: AbstractArray{Bool}
true
julia> Array{Bool} <: AbstractArray{Bool}
true
Esto facilita la escritura de métodos genéricos que toman cualquiera de los dos.