扩展Repa数组形状

Tom*_*age 5 haskell repa

我正在编写一个生成图像的程序,我希望将其带入Repa阵列.我目前正在使用的类型:

data Colour = Colour Double Double Double
Run Code Online (Sandbox Code Playgroud)

表示像素,我有一个(可能效率低但功能齐全)的函数,它将a Colour转换为DIM1数组:

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

目前我的程序中的图像只是一个[Colour]具有(Int, Int)代表尺寸的值.

我可以使用它来构建一个Array V DIM2 Colour足够容易的,但有没有办法(使用colourToRepa或以其他方式)将此数组扩展为Array U DIM3 Double

使用列表我可以使用map但是Repa的地图保留了数组的形状(我想从a DIM2到a DIM3).

Don*_*art 6

请记住,形状与repa中的数据分开存储,因此您可以将阵列从DIM1 重新整形为DIM3,而无需更改阵列的范围.

我们有一个DIM1(扁平)阵列:

> 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]
Run Code Online (Sandbox Code Playgroud)

它的范围是:

> extent x
Z :. 9
Run Code Online (Sandbox Code Playgroud)

使用重塑,我们可以将阵列的形状从1D"投射"到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]
Run Code Online (Sandbox Code Playgroud)

它的类型改变:

> :t y
y :: Array DIM3 Double
Run Code Online (Sandbox Code Playgroud)