2012年9月12日水曜日

HaskellのaccumArray


Matlabのaccumarrayを良く使っていたので,Haskellにもあるかと思って探してみた.
以下はそのメモ.

Data.Arrayの中にaccumArrayがある
accumArray :: (e->a->e) -> e -> (i,i) -> [(i,a)] -> Array i e
引数1. (e->a->e) は a型 の値をどうやって e型 に蓄積していくかを決める関数
引数2. e は e型の値であり,蓄積の初期値
引数3. (i,i)はインデックスの範囲を決めるタプル
引数4. [(i,a)]は蓄積の対象になるデータ
引数5. Array i e は戻り値.[(i,e)]

ここでの目的からでは1の(e->a->e)は(+)で良い.[(i,a)]のiがインデックスで
ヒストグラムのi番目のビンを表すなら,(i,a)の存在はi番目のビンに相当する
Array i e の i番目のeをe+1という操作で蓄積したいため,aは常に1となるよう
に[(i,a)]を生成すればよい.また,この場合の蓄積の初期値は0で良いので,eは
0を渡しておけばよい.(i,i)はインデックスの範囲を決めるタプルなので,1から
10までのインデックスがあるなら(1,10)となる.すなわち(smallest-index,
largest-index)である.
例)Prelude Data.Array> accumArray (+) 0 (1,7) [(1,1),(3,1),(5,1),(7,1)]
       array (1,7) [(1,1),(2,0),(3,1),(4,0),(5,1),(6,0),(7,1)]

inRange :: Ix a => (a,a) -> a -> Bool も同様にData.Arrayの関数
引数1. (a,a)は範囲を表すタプル.(smallest-value, largest-value)だが,
          valueはIntやCharである必要がある.(Ix型.詳細は:i Ixで)
引数2. a は範囲内に存在するかどうかテストする値を表す
引数3. a が (a,a)内にあればTrueを返し,なければFalseを返す
例)Prelude Data.Array> inRange (1,5) 3
       True
    Prelude Data.Array> inRange (1,5) 7
       False
    Prelude Data.Array> inRange ((1,5),(10,12)) (7,8)
       True

Data.ArrayのArray型はNumeric.LinearAlgebraのfromArray2D
などの関数でMatrix型に変換できる

0 件のコメント: