2013-01-14 10 views
5

Piszę program, który generuje obrazy, które chciałbym wprowadzić do tablicy Repa. Obecnie używam typ:Rozszerzanie kształtów tablicy Repa

data Colour = Colour Double Double Double 

do reprezentowania pikseli, a mam (prawdopodobnie nieefektywne ale funkcjonalny) funkcję, która przekształca Colour w DIM1 tablicy:

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

Obraz w moim Program w tej chwili jest po prostu wartością [Colour] z (Int, Int) reprezentującymi wymiary.

mogę to wykorzystać do budowy Array V DIM2 Colour dość łatwo, ale czy istnieje sposób (za pomocą colourToRepa lub inny), aby rozwinąć tę tablicę do Array U DIM3 Double?

Z list mógłby po prostu użyć map ale mapa repa za zachowuje kształt tablicy (chcę iść z DIM2 do DIM3).

Odpowiedz

6

Pamiętaj, że kształty są przechowywane oddzielnie dla danych w repa, więc będziesz reshaping tablicy od DIM1 do DIM3, bez zmiany extent tablicy.

Mamy DIM1 (płaski) tablicy:

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

To stopniu:

> extent x 
Z :. 9 

Korzystanie przekształcenia możemy 'rzucać' kształt tablicy z 1D na 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] 

oraz typ zmiany:

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

Ah. Zapomniałem o tym. Dzięki! –

1

zależności jak dokładnie chcesz dodać dodatkowy wymiar można również użyć extend, na przykład:

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