我正在为布尔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()
(因为我看不出区别)?
答案 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
这使得编写采用任何一种方法的通用方法变得容易。