res*_*chu 20 arrays boolean bitarray julia
我正在为布尔2d数组编写一个函数:
function foo(A::Array{Bool,2})
...
end
Run Code Online (Sandbox Code Playgroud)
用它评估和测试它
A = randbool(3,3)
foo(A)
Run Code Online (Sandbox Code Playgroud)
回报
ERROR: 'foo' has no method matching foo(::BitArray{2})
Run Code Online (Sandbox Code Playgroud)
显然,randbool()生成一个BitArray,而我认为randbool()会产生一个Array{Bool}.
如何Array{Bool}和BitArray相关?为什么它们都存在?
我可以foo()用这样的方式编写它使用单一方法接受两种输入类型(因为我看不出差异)?
tho*_*oly 23
一个Array{Bool}存储每个true/false值作为Bool,其内部表示为一个UInt8.因此,如果您的数组包含N元素,则需要使用N字节来存储它.
A BitArray将每个true/false值存储为单个位,其中(概念上)将其中的8个打包为单个位UInt8.因此,只需要N/8字节来存储数组.A BitArray还定义了一些方法,可以为您处理所有必需的bit-twiddling操作.
根据操作,BitArrays有时比相应的慢Array{Bool},有时更快.但总的来说,性能差异非常小,所以BitArray除非你有特殊的理由不这样做,否则使用s 是有意义的.但总体而言,它们是可以互换的.
请注意,两者都是以下子类型AbstractArray{Bool}:
julia> BitArray <: AbstractArray{Bool}
true
julia> Array{Bool} <: AbstractArray{Bool}
true
Run Code Online (Sandbox Code Playgroud)
这使得编写采用任何一种方法的通用方法变得容易.