Julia 中的 Array{Bool} 和 BitArray 有什么区别,它们之间有什么关系?

What's the difference between Array{Bool} and BitArray in Julia and how are they related?

我正在为布尔二维数组编写一个函数:

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

使用

对其进行评估和测试
A = randbool(3,3)
foo(A)

returns

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

显然,randbool() 会生成 BitArray,而我假设 randbool() 会生成 Array{Bool}

Array{Bool}BitArray 有什么关系?为什么它们都存在?

我能否以这样一种方式编写 foo(),使其使用一种方法接受两种输入类型(因为我看不出有什么区别)?

Array{Bool} 将每个 true/false 值存储为 Bool,在内部表示为 UInt8。因此,如果您的数组有 N 个元素,则需要 N 个字节来存储它。

A BitArray 将每个 true/false 值存储为单个位,其中(概念上)将其中的 8 个打包到单个 UInt8 中。因此,它只需要 N/8 个字节来存储数组。 BitArray 还定义了一些方法来为您处理所有需要的位操作。

根据操作的不同,BitArrays 有时比相应的 Array{Bool} 慢,有时更快。但总的来说,性能差异非常小,所以使用 BitArrays 是有意义的,除非你有特定的理由不这样做。但总的来说,它们是可以互换的。

请注意,两者都是 AbstractArray{Bool} 的子类型:

julia> BitArray <: AbstractArray{Bool}
true

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

这使得编写采用任一方法的通用方法变得容易。