我正在编写一个生成图像的程序,我想把它带到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
)。
答案 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