2013-01-14 17 views
5

मैं एक प्रोग्राम लिख रहा हूं जो छवियां उत्पन्न करता है, जिसे मैं एक रेपा सरणी में लाना चाहता हूं। मैं वर्तमान में प्रकार उपयोग कर रहा हूँ:रिपा सरणी आकार का विस्तार

data Colour = Colour Double Double Double 

पिक्सल का प्रतिनिधित्व करने, और मैं एक (शायद अक्षम लेकिन कार्यात्मक) समारोह जो एक DIM1 सरणी में एक Colour धर्मान्तरित है: में

colourToRepa :: Colour -> Array U DIM1 Double 
colourToRepa (Colour r g b) = R.fromListUnboxed (Z :. (3::Int)) [r,g,b] 

एक छवि मेरी फिलहाल कार्यक्रम [Colour] मूल्य (Int, Int) आयामों का प्रतिनिधित्व करता है।

मैं इसे आसानी से Array V DIM2 Colour बनाने के लिए उपयोग कर सकता हूं, लेकिन इस सरणी को Array U DIM3 Double में विस्तारित करने के लिए कोई तरीका है (colourToRepa या अन्यथा) का उपयोग करना?

सूचियों के साथ मैं केवल map का उपयोग कर सकता हूं लेकिन रेपा का नक्शा सरणी के आकार को संरक्षित करता है (मैं DIM2 से DIM3 पर जाना चाहता हूं)।

उत्तर

6

याद रखें कि आकार को रेपा में डेटा से अलग से संग्रहीत किया जाता है, इसलिए आप reshaping सरणी के extent को बदले बिना डीआईएम 1 से डीआईएम 3 तक सरणी लेंगे।

> let x :: Array DIM1 Double ; x = fromList (Z :. (9::Int)) [1..9] 
> x 
Array (Z :. 9) [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 

यह हद है है:

हम एक DIM1 (फ्लैट) सरणी है

> extent x 
Z :. 9 

नयी आकृति प्रदान हम 'डाली' कर सकते हैं 3 डी करने के लिए -1 डी से सरणी के आकार का उपयोग करते हुए:

> let y :: Array DIM3 Double ; 
     y = reshape (Z :. (3::Int) :. (3::Int) :. (1::Int)) x 
> y 
Array (Z :. 3 :. 3 :. 1) [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 

और इसके प्रकार में परिवर्तन:

> :t y 
y :: Array DIM3 Double 
+0

आह। मैं उसे भूल गया था। धन्यवाद! –

1

आप ठीक कैसे एक अतिरिक्त आयाम जोड़ना चाहते हैं पर निर्भर करता है भी, extend उपयोग कर सकते हैं, उदाहरण के लिए:

extraDim :: Source a Double => 
      Array a (Z :. Int :. Int) Double -> 
      Array D (Z :.Int :. Int :. Int) Double 
extraDim a = extend (Any :. i :. All) a 
       where (Z :. i :. j) = extent a