【问题标题】:Expanding Repa array shapes扩展 Repa 阵列形状
【发布时间】:2013-01-14 16:34:05
【问题描述】:

我正在编写一个生成图像的程序,我想将其带入 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)。

【问题讨论】:

    标签: haskell repa


    【解决方案1】:

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

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

    【讨论】:

    • 啊。我忘记了。谢谢!
    【解决方案2】:

    根据您想要添加额外维度的具体方式,也可以使用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
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2016-10-11
      • 2013-07-28
      • 2019-10-21
      相关资源
      最近更新 更多