2015-04-14 8 views
17

pisałem funkcję dla logicznych 2d tablice:Jaka jest różnica między Array {Bool} i BitArray w Julia i jak są one powiązane?

function foo(A::Array{Bool,2}) 
    ... 
end 

Ocenianie i testowanie go

A = randbool(3,3) 
foo(A) 

zwrotów

ERROR: 'foo' has no method matching foo(::BitArray{2}) 

Oczywiście randbool() generuje BitArray, natomiast Przypuszczałem randbool() przyniosłoby Array{Bool}.

W jaki sposób powiązane są Array{Bool} i BitArray? Dlaczego oba istnieją?

Czy mogę napisać foo() w taki sposób, aby akceptował oba typy wejść za pomocą jednej metody (ponieważ nie widzę różnicy)?

+3

Twoje założenie dotyczące zachowania 'randbool' nie jest nierozsądne - to dość zła nazwa! Został przestarzały w wersji 0.4 i zmieniono jego nazwę na 'bitrand' (co brzmi bardziej, jakby tworzył BitArray). I istnieje nowa metoda 'rand (Bool, ...)', aby jawnie utworzyć tablicę 'Bool'. Możesz zacząć używać tych nowych definicji w 0.3 za pomocą pakietu [Compat] (https://github.com/JuliaLang/Compat.jl). –

Odpowiedz

18

Przechowuje każdą wartość true/false jako Bool, która jest wewnętrznie reprezentowana jako UInt8. Więc jeśli twoja macierz ma elementy N, zajmie ona N bajtów, aby ją przechowywać.

A BitArray przechowuje każdą wartość true/false jako pojedynczy bit, z (koncepcyjnie) 8 z nich spakowanymi w pojedyncze UInt8. W związku z tym potrzeba tylko N/8 bajtów do przechowywania tablicy. A BitArray ma również zdefiniowane metody, które obsługują wszystkie wymagane operacje bit-twiddling.

W zależności od operacji, BitArray s są czasami wolniejsze niż odpowiadające im Array{Bool}, a czasami są szybsze. Różnice w wydajności są jednak niewielkie, więc warto używać BitArray s, chyba że masz ku temu konkretny powód. Ale ogólnie są dość wymienne.

Zauważ, że oba są podtypy AbstractArray{Bool}:

julia> BitArray <: AbstractArray{Bool} 
true 

julia> Array{Bool} <: AbstractArray{Bool} 
true 

Ułatwia to napisać metod generycznych, które mają ani jednego.

+2

'AbstractArray {Bool}' jest dokładnie tym typem, którego szukałem. – reschu

Powiązane problemy