我正在处理样本由Float
组成的信号。我编写的一些算法只需要知道信号何时穿过x轴(即正值到负值,反之亦然)。当我进行这些操作时,我意识到我不需要知道每个样本的实际Float
值。我只需要知道样本的值是否为正值。
我最初将信号表示为Vector
的{{1}}。在我发现之后,我开始将其表示为Float
Vector
个值(即Boolean
表示负值,False
表示正值。结果证明效率更高,我在运行时和内存消耗方面都提高了程序的性能。
我仍然想知道是否没有更有效的方式来表示这个“二进制数据集合”。像True
或Bit Vector
这样的东西。我在Hackage上找到了BitArray,但它似乎不支持Bit Array
所具有的相同功能。
是否有更有效的方式来表示我的用例数据,还是应该坚持Vector
Vector
个值?
答案 0 :(得分:1)
vector
和array
软件包分别提供每个字节一个bool和每个一个bool的选项。
首先,来自Vector Bool
的{{1}}使用每Data.Vector.Unboxed
个字节的字节数组。这可以从模块Bool
中的来源进行验证,其中Data.Vector.Unboxed.Base
定义为:
Vector Bool
获取和设置是通过函数调解的:
newtype instance Vector Bool = V_Bool (P.Vector Word8)
或者,可以通过分析程序直接验证:
fromBool :: Bool -> Word8
toBool :: Word8 -> Bool
并观察它分配的超过1,000,000,000个字节。
其次,来自import Data.Vector.Unboxed as V
main = let v = V.replicate 1000000000 True
in print (v ! 5)
的{{1}}被实现为位向量,每位有一个UArray Int Bool
。相关源位于Data.Array.Unboxed
,您可以在其中查看实例中使用的位操作:
Bool
同样,这可以通过分析直接验证:
Data.Array.Base
并验证它分配大约125,000,000个字节。