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
还定义了一些方法来为您处理所有需要的位操作。
根据操作的不同,BitArray
s 有时比相应的 Array{Bool}
慢,有时更快。但总的来说,性能差异非常小,所以使用 BitArray
s 是有意义的,除非你有特定的理由不这样做。但总的来说,它们是可以互换的。
请注意,两者都是 AbstractArray{Bool}
的子类型:
julia> BitArray <: AbstractArray{Bool}
true
julia> Array{Bool} <: AbstractArray{Bool}
true
这使得编写采用任一方法的通用方法变得容易。
我正在为布尔二维数组编写一个函数:
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
还定义了一些方法来为您处理所有需要的位操作。
根据操作的不同,BitArray
s 有时比相应的 Array{Bool}
慢,有时更快。但总的来说,性能差异非常小,所以使用 BitArray
s 是有意义的,除非你有特定的理由不这样做。但总的来说,它们是可以互换的。
请注意,两者都是 AbstractArray{Bool}
的子类型:
julia> BitArray <: AbstractArray{Bool}
true
julia> Array{Bool} <: AbstractArray{Bool}
true
这使得编写采用任一方法的通用方法变得容易。