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

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)

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

  • `AbstractArray {Bool}`正是我想要的类型. (2认同)