2012-03-21 6 views
7

サブアレイへの変換を行う必要があり、サブアレイのサブアレイ上での変換などが必要になることがあります。Haskellでの配列の修正とインデックスの記憶

ハスケルでこれを行うための直感的な方法がありますか?たとえば、サブアレイなどの定義ですか?私は "穏やかな紹介"で配列のセクションを読んで、それに対処していないし、それを行う方法を見つけるのは難しい。

これは、ウィキペディアでhereと記載されているハンガリーアルゴリズムの実装用です。

だから、これまでのところ、私は次のことを行っている:

import Array 

step1 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a 
step1 a  = a // [ ((i,j), f (i,j)) | (i,j) <- range (bounds a) ] where 
    f (i,j) = a!(i,j) - minRow i 
    minRow i = minimum [ a!(i,j) | j <- [1..(snd . snd . bounds) a] ] 

step2 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a 
step2 a  = a // [ ((i,j), f (i,j)) | (i,j) <- range (bounds a) ] where 
    f (i,j) = a!(i,j) - minCol j 
    minCol j = minimum [ a!(i,j) | i <- [1..(fst . snd . bounds) a] ] 

問題が解決される場合には、私は部分行列に手順を続けて手順3と4を実装する方法がわからないということです容易に入手できない。

+0

Hackageに役立つサンプルコードがあります.http://hackage.haskell.org/packages/archive/Munkres/0.1/doc/html/src/Data-Algorithm-Munkres.html#hungarianMethodInt –

+0

私は本当に理解していないここにコードの多く。たとえば、 '@ '演算子はどのように定義されていますか?これは、 'xxs @(x:xs)'のような式で、ほぼ2行目で使用されます。 – Undreren

+0

'@'演算子は、パターンにマッチするコンポーネントに名前を付けるために使用されます。これは、 'xxs'が'(x:xs) 'と一致する式を参照するために使用できることを意味します。 –

答えて

1

私は、ハックのビットですが、回避する方法を見つけました。 2D配列、つまりArray (Int,Int) Intの配列でのみ動作します。ここに私がやったことだ:

import Data.Array 
import Control.Applicative 

updateSubArr :: [Int] -> [Int] -> (Array (Int,Int) Int -> Array (Int,Int) Int) 
         -> Array (Int,Int) Int -> Array (Int,Int) Int 
updateSubArr rows cols f arr = arr // (zip [(i,j) | i <- rows, j <- cols ] 
           [ fSubArr!i | i <- range $ bounds subArr ]) where 
fSubArr = f subArr 
subArr = subArray cols rows arr 

subArray rows cols arr = subArr where 
    js  = length cols 
    is  = length rows 
    subArr  = array subBounds $ zip (range subBounds) 
          [ arr!(i,j) | i <- rows, j <- cols ] 
    subRange = range subBounds 
    subBounds = ((1,1),(is,js)) 

これは、一般的なArray a bのために働くようにすることができますか?

関連する問題