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

时间:2015-04-14 08:52:59

标签: arrays boolean julia bitarray

我正在为布尔2d数组编写一个函数:

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

使用

评估和测试它
A = randbool(3,3)
foo(A)

返回

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

显然,randbool()会生成BitArray,而我认为randbool()会产生Array{Bool}

Array{Bool}BitArray如何相关?为什么它们都存在?

我是否可以使用单一方法接受两种输入类型的方式来编写foo()(因为我看不出区别)?

1 个答案:

答案 0 :(得分:23)

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

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

根据操作的不同,BitArray有时会慢于相应的Array{Bool},有时会更快。但总的来说,性能差异非常小,因此除非您有特殊原因,否则使用BitArray是有意义的。但总的来说,它们是可以互换的。

请注意,两者都是AbstractArray{Bool}

的子类型
julia> BitArray <: AbstractArray{Bool}
true

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

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