I'm writing a program that generates images, which I would like to bring into a Repa array. I'm currently using the type:
data Colour = Colour Double Double Double
to represent pixels, and I have a (probably inefficient but functional) function which converts a Colour
into a DIM1
array:
colourToRepa :: Colour -> Array U DIM1 Double
colourToRepa (Colour r g b) = R.fromListUnboxed (Z :. (3::Int)) [r,g,b]
An image in my program at the moment is just a [Colour]
value with a (Int, Int)
representing dimensions.
I can use this to build a Array V DIM2 Colour
easily enough, but is there a way (using colourToRepa
or otherwise) to expand this array into a Array U DIM3 Double
?
With lists I could just use map
but Repa's map preserves the shape of the array (I want to go from a DIM2
to a DIM3
).
Remember that shapes are stored separately to data in repa, so you would be reshaping the array from DIM1 to DIM3, without changing the extent of the array.
We have a DIM1 (flat) 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]
It's extent is:
> extent x
Z :. 9
Using reshape we can 'cast' the shape of the array from 1D to 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]
And its type changes:
> :t y
y :: Array DIM3 Double
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With