5

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

data Colour = Colour Double Double Double

来表示像素,我有一个(可能效率低下但功能强大)函数将 aColour转换为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 的映射保留了数组的形状(我想从 aDIM2转到 a DIM3)。

4

2 回答 2

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]

它的程度是:

> extent x
Z :. 9

使用 reshape 我们可以将数组的形状从 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
于 2013-01-14T17:03:24.800 回答
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
于 2013-01-16T07:42:58.453 回答