2017-06-12 6 views
0

サンプルはFloatで構成されています。私が書いたアルゴリズムの中には、信号がx軸を横切るとき(つまり、正の値を負の値に、逆もまた同様)に知る必要があります。私がこれらの操作をしているとき、私は実際のFloatの値を知る必要はないことに気付きました。私は、サンプルの価値が肯定的であるかどうかを知る必要があります。バイナリデータのコレクションの表現

私はもともとVectorFloatの信号を表していました。私の発見後、Vectorの値がBoolean(つまり、負の値はFalse、正の値はTrue)と表示され始めました。これははるかに効率的であることが判明し、ランタイムとメモリ消費の両方でプログラムのパフォーマンスを改善しました。

私は、この「バイナリデータのコレクション」をより効率的に表現する方法がないのかどうか疑問です。 Bit VectorまたはBit Arrayのようなものです。私はHackageでBitArrayを見つけましたが、Vectorと同じ機能をサポートしていないようです。

私のユースケースのデータをより効率的に表現する方法はありますか?VectorBooleanの値に固定する必要がありますか?

+0

「ベクター」のどの機能が必要ですか? –

+0

@WillemVanOnsem標準的なHaskell Listプリミティブ(マップ、フォールド、フィルターなど)私は 'V.generate'を使ってすべてのサンプルを読み込んでファイルを作成します。 –

+2

C++の標準ライブラリには、スペース効率のためにバイトの完全な内容を使用する[bool'](http://en.cppreference.com/w/cpp/container/vector_bool)のテンプレート特殊化が含まれていますが、これは[今は広く考えられている](https://isocpp.org/blog/2012/11/on-vectorbool)。このようなベクトルの場合、パフォーマンスは実質的に悪くなる傾向があります。これは、要素アクセスをポインタ演算で直接実行できないためです。 - 連続した信号の符号のみを効率的に表現したい場合は、符号が変化するところに_spotsだけを格納することを検討する必要があります。 – leftaroundabout

答えて

1

vectorおよびarrayパッケージから、それぞれ1バイトあたり1バイトおよび1ビットあたり1バイトのオプションが利用できます。

最初に、のVector Boolは、1バイトがBoolであるバイト配列を使用します。機能を介して媒介される

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

と取得および設定:これはVector Boolのように定義されているモジュールData.Vector.Unboxed.Baseソースから確認することができる

あるいは
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を割り当てていることを確認しますバイト。

+0

答えをありがとう!本当に面白い!私が間違っている場合は私を訂正してください。しかし、 'Vector'は速く、' Array'は私の問題に対してよりメモリ効率が良いですか? –

+0

さて、 'Array'は' Vector'よりもはるかにメモリ効率がよいでしょうが、速度に関しては、特定のアルゴリズムに大きく左右されるかもしれません。私はベンチマークがそれに答える唯一の方法だと思います。 –

関連する問題