扩展Repa数组形状

时间:2013-01-14 16:34:05

标签: haskell repa

我正在编写一个生成图像的程序,我想把它带到Repa数组中。我目前正在使用类型:

data Colour = Colour Double Double Double

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

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,但有没有办法(使用colourToRepa或其他方式)将此数组扩展为Array U DIM3 Double

使用列表我可以使用map但是Repa的地图会保留数组的形状(我希望从DIM2转到DIM3)。

2 个答案:

答案 0 :(得分:6)

请记住,形状是单独存储到repa中的数据,因此您将reshaping数组从DIM1到DIM3,而不更改数组的extent

我们有一个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]

它的范围是:

> extent x
Z :. 9

使用重塑,我们可以将数组的形状从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]

它的类型改变了:

> :t y
y :: Array DIM3 Double

答案 1 :(得分: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