我正在写一个生成图像的程序,我想把它带到一个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]目前我的程序中的一个图像只是一个带有代表尺寸的(Int, Int)的[Colour]值。
我可以使用它轻松地构建Array V DIM2 Colour,但是是否有方法(使用colourToRepa或其他方式)将此数组扩展为Array U DIM3 Double
对于lists,我可以只使用map,但是Repa的map保留了数组的形状(我想从DIM2转换为DIM3)。
发布于 2013-01-15 01:03:25
请记住,shapes与repa中的数据是分开存储的,因此您可以将数组从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使用重塑,我们可以将数组的形状从一维转换为三维:
> 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-16 15:42:58
也可以使用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 ahttps://stackoverflow.com/questions/14322566
复制相似问题