2012-03-21 11 views
7

मुझे ट्रांसफॉर्मेशन को एक सबएरे में बदलने की आवश्यकता है, और इसे उपराय के उप-उपरोक्त में परिवर्तन करने की आवश्यकता हो सकती है।हास्केल में सरणी संशोधित करना और इंडेक्स को याद करना

क्या हास्केल में ऐसा करने के सहज तरीके हैं, जैसे कि उपरायरे को परिभाषित करना या ऐसा कुछ? मैंने "हैकेल के लिए एक सौम्य परिचय" में सरणी पर अनुभाग पढ़ा है, और यह इसे संबोधित नहीं करता है, और मुझे इसे करने का एक तरीका खोजने में कठिन समय है।

यह हंगरी एल्गोरिदम के कार्यान्वयन के लिए है जैसा कि विकिपीडिया पर 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, जो एक submatrix पर प्रक्रिया जारी है को लागू करने के मामले में एक समाधान है पता नहीं है कि है आसानी से उपलब्ध नहीं है।

+0

हैकेज पर कुछ नमूना कोड है जो मदद कर सकता है, http://hackage.haskell.org/packages/archive/Munkres/0.1/doc/html/src/Data-Algorithm-Munkres.html#hglishMethodInt –

+0

वहां है यहां बहुत सारे कोड हैं जो मैं वास्तव में समझ में नहीं आता हूं। उदाहरण के लिए, '@' ऑपरेटर को कैसे परिभाषित किया जाता है? इसका उपयोग 'xxs @ (x: xs)' जैसे अभिव्यक्तियों में लगभग हर दूसरी पंक्ति में किया जाता है। – Undreren

+0

'@' ऑपरेटर का उपयोग पैटर्न से मेल खाने वाले घटकों को नाम देने के लिए किया जाता है। इसका अर्थ यह है कि 'xxs' का मिलान किया जा सकता है जो '(x: xs)' –

उत्तर

1

मुझे चारों ओर काम करने का एक तरीका मिला, हालांकि यह एक हैक का थोड़ा सा है। और यह केवल 2 डी सरणी पर काम करता है, यानी 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 के लिए काम करने के लिए बनाया जा सकता है?

संबंधित मुद्दे