簡體   English   中英

代表二進制數據的集合

[英]Represent of a collection of binary data

我正在處理其中樣本包含Float的信號。 我編寫的某些算法僅需要知道信號何時穿過x軸(即,正值變為負值,反之亦然)。 當我執行這些操作時,我意識到我不需要知道每個樣本的實際Float值。 我只需要知道樣本的值是否為正即可。

我最初將信號表示為FloatVector 發現之后,我開始將其表示為Boolean值的Vector (即, False (負)值, True (正)值)。 事實證明,這要高效得多,而且我在運行時和內存消耗方面都提高了程序的性能。

我仍然想知道是否沒有一種更有效的方式來表示這種“二進制數據集合”。 就像一個Bit VectorBit Array 我在Hackage上找到了BitArray ,但它似乎不支持Vector所具有的相同功能。

是否有一種更有效的方式來表示用例的數據,還是應該堅持使用BooleanVector

vectorarray程序包中分別提供了每字節1個布爾值和每比特1個布爾值選項。

首先,來自Data.Vector.UnboxedVector Bool使用一個字節數組,每個Bool一個字節。 可以從Data.Vector.Unboxed.Base模塊中的源進行驗證,其中Vector Bool定義為:

newtype instance Vector    Bool = V_Bool  (P.Vector    Word8)

和獲取和設置是通過以下功能來實現的:

fromBool :: Bool -> Word8
toBool :: Word8 -> Bool

另外,也可以通過對程序進行概要分析來直接對其進行驗證:

import Data.Vector.Unboxed as V
main = let v = V.replicate 1000000000 True
  in print (v ! 5)

並觀察到它分配的剛好超過1,000,000,000個字節。

第二,一個UArray Int BoolData.Array.Unboxed被實現為位向量,其中一個Bool每比特。 相關源位於Data.Array.Base ,您可以在其中查看實例中使用的位操作:

instance IArray UArray Bool where
    ...
    unsafeAt (UArray _ _ _ arr#) (I# i#) = isTrue#
        ((indexWordArray# arr# (bOOL_INDEX i#) `and#` bOOL_BIT i#)
        `neWord#` int2Word# 0#)

同樣,這可以通過分析直接驗證:

import Data.Array.Unboxed as A
main = let v = A.listArray (1,1000000000) (repeat True) :: UArray Int Bool
  in print (v ! 5)

並確認它分配了大約125,000,000字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM