扩展 Repa 数组形状

5

我正在编写一个生成图像的程序,希望将其导入到Repa数组中。我目前使用的类型是:

data Colour = Colour Double Double Double

表示像素,我有一个(可能效率不高但功能正常)的函数,可以将Color转换为DIM1数组:

colourToRepa :: Colour -> Array U DIM1 Double
colourToRepa (Colour r g b) = R.fromListUnboxed (Z :. (3::Int)) [r,g,b]

目前,我的程序中的图像只是一个[颜色]值和一个代表尺寸的(Int, Int)

我可以使用这些内容轻松构建一个Array V DIM2 颜色,但是否有一种方法(使用colourToRepa或其他方式),可以将此数组扩展为Array U DIM3 Double

对于列表,我可以使用map,但Repa的映射会保留数组的形状(我想从DIM2转换到DIM3)。

2个回答

6

请记住,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

使用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

啊,我忘了。谢谢! - Tom Savage

1

根据您想要添加额外维度的方式,也可以使用扩展,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接