2013-01-14 60 views
5

我在写一个程序,生成图像,我想将它带入一个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的地图保留了阵列的形状(我想从DIM2DIM3)。

回答

6

请记住,形状是单独存储到数据中的,因此您将从DIM1到DIM3的数组为reshaping,而不更改阵列的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 

使用重塑我们不能投'从一维阵列到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 
+0

啊。我忘记了这一点。谢谢! –

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