2013-01-14 13 views
5

Ich schreibe ein Programm, das Bilder erzeugt, die ich in ein Repa-Array bringen möchte. Ich verwende gerade den Typen:Repa-Array-Formen erweitern

data Colour = Colour Double Double Double 

Pixel zu repräsentieren, und ich habe ein (wahrscheinlich ineffizient, aber funktional) Funktion, die eine in einen ColourDIM1 Array konvertiert:

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

Ein Bild in meinem Programm im Moment ist nur ein [Colour] Wert mit einer (Int, Int) Darstellung der Abmessungen.

kann ich dies eine Array V DIM2 Colour leicht genug, um zu bauen, aber ist es eine Möglichkeit (colourToRepa oder anderweitig verwenden) dieses Array in ein Array U DIM3 Double zu erweitern?

Mit Listen könnte ich einfach verwenden map aber Repa-Karte behält die Form des Arrays (Ich möchte von einem DIM2 zu einem DIM3 gehen).

Antwort

6

Denken Sie daran, dass Shapes separat zu Daten in Repa gespeichert werden, so dass Sie reshaping das Array von DIM1 zu DIM3 wären, ohne die extent des Arrays zu ändern.

Wir haben eine DIM1 (flach) Array:

> 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] 

Es ist soweit ist:

> extent x 
Z :. 9 

umformen Mit wir können 'werfen' die Form des Arrays von 1D bis 3D:

> 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] 

Und seine Art Änderungen:

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

Ah. Das hatte ich vergessen. Vielen Dank! –

1

auf genau Je nachdem, wie Sie wollen auch eine zusätzliche Dimension hinzufügen können extend verwenden, zum Beispiel:

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