首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Repa数组形状

扩展Repa数组形状
EN

Stack Overflow用户
提问于 2013-01-15 00:34:05
回答 2查看 361关注 0票数 5

我正在写一个生成图像的程序,我想把它带到一个Repa数组中。我当前使用的类型是:

代码语言:javascript
复制
data Colour = Colour Double Double Double

为了表示像素,我有一个将Colour转换为DIM1数组的函数(可能效率不高,但功能很强):

代码语言:javascript
复制
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)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-15 01:03:25

请记住,shapes与repa中的数据是分开存储的,因此您可以将数组从DIM1转换为DIM3,而不会更改数组的extent

我们有一个DIM1 (平面)数组:

代码语言:javascript
复制
> 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]

它的范围是:

代码语言:javascript
复制
> extent x
Z :. 9

使用重塑,我们可以将数组的形状从一维转换为三维:

代码语言:javascript
复制
> 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]

并且它的类型会发生变化:

代码语言:javascript
复制
> :t y
y :: Array DIM3 Double
票数 6
EN

Stack Overflow用户

发布于 2013-01-16 15:42:58

也可以使用extend,具体取决于添加额外维度的方式,例如:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14322566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档