【问题标题】:What's the difference between Array{Bool} and BitArray in Julia and how are they related?Julia 中的 Array{Bool} 和 BitArray 有什么区别,它们之间有什么关系?
【发布时间】:2015-06-19 19:26:49
【问题描述】:

我正在为布尔二维数组编写一个函数:

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(),使其使用单一方法接受两种输入类型(因为我看不出区别)?

【问题讨论】:

  • 您对randbool 行为的假设并非不合理——这是一个非常糟糕的名字!它在 0.4 中已被弃用并重命名为 bitrand(听起来更像是创建了一个 BitArray)。还有一种新方法rand(Bool, …) 可以显式创建Bool 的数组。您可以在 0.3 中通过 Compat 包开始使用这些新定义。

标签: arrays boolean julia bitarray


【解决方案1】:

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

BitArray 将每个 true/false 值存储为一个位,其中(概念上)8 个被打包到一个 UInt8 中。因此,只需要N/8 个字节来存储数组。 BitArray 还定义了为您处理所有必需的位旋转操作的方法。

根据操作的不同,BitArrays 有时比对应的Array{Bool} 慢,有时更快。但总的来说,性能差异非常小,因此使用BitArrays 是有意义的,除非您有特定的理由不这样做。但总的来说,它们是可以互换的。

请注意,两者都是AbstractArray{Bool}的子类型:

julia> BitArray <: AbstractArray{Bool}
true

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

这使得编写采用任一方法的泛型方法变得容易。

【讨论】:

  • AbstractArray{Bool} 正是我要找的类型。
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2011-09-19
  • 1970-01-01
  • 2011-03-02
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多