Arrays 对于具有数百万像素的二维非固定像素阵列,建议使用什么Haskell表示法?
我想在Haskell中解决一些图像处理问题。我正在处理具有数百万像素的双色(位图)和彩色图像。我有几个问题:Arrays 对于具有数百万像素的二维非固定像素阵列,建议使用什么Haskell表示法?,arrays,haskell,image-processing,bitmap,Arrays,Haskell,Image Processing,Bitmap,我想在Haskell中解决一些图像处理问题。我正在处理具有数百万像素的双色(位图)和彩色图像。我有几个问题: 在Vector.unbox和UArray之间,我应该根据什么进行选择?它们都是非固定数组,但是向量抽象似乎被大量宣传,尤其是循环融合。Vector是否总是更好?如果没有,什么时候应该使用哪种表示法? 对于彩色图像,我希望存储16位整数的三倍或单精度浮点数的三倍。为此,Vector或UArray是否更易于使用?性能更好 对于双色图像,我只需要每像素存储1位。是否有一个预定义的数据类型可以通
Vector.unbox
和UArray
之间,我应该根据什么进行选择?它们都是非固定数组,但是向量
抽象似乎被大量宣传,尤其是循环融合。Vector
是否总是更好?如果没有,什么时候应该使用哪种表示法?Vector
或UArray
是否更易于使用?性能更好我是一名函数式程序员,不需要变异:-)对于多维数组,在我看来,Haskell当前的最佳选择是 Repa提供高性能、规则、多维、形状多态的并行阵列。所有数字数据都是以不装箱的方式存储的。如果在运行程序时在命令行上提供+RTS-nwhatver,则使用Repa组合器编写的函数将自动并行 最近,它已用于一些图像处理问题:
在Vector.unbox和UArray之间,我应该根据什么进行选择 它们具有大致相同的底层表示形式,但是,主要区别在于处理向量的API的广度:它们几乎具有通常与列表关联的所有操作(使用融合驱动优化框架),而
UArray
几乎没有API
对于彩色图像,我希望存储16位整数的三倍或单精度浮点数的三倍
UArray
更好地支持多维数据,因为它可以使用任意数据类型进行索引。虽然这在Vector
中是可能的(通过为元素类型编写UA
的实例),但这并不是Vector
的主要目标——相反,这是Repa
的步骤,由于形状索引,可以非常方便地使用以高效方式存储的自定义数据类型
在Repa
中,您的三重短裤的类型为:
Array DIM3 Word16
也就是说,单词16的3D数组
对于双色图像,我只需要每像素存储1位
UArrays将Bool打包为位,Vector使用Bool的实例进行位打包,而不是使用基于Word8
的表示。然而,从(过时的)uvector库为向量编写一个位打包实现是很容易的。在引擎盖下,Repa
使用Vectors
,因此我认为它继承了库表示选择
是否有一个预定义的数据类型可以帮助我将多个像素打包到一个单词中
对于不同的单词类型,您可以使用任何库的现有实例,但可能需要编写一些使用Data.Bits滚动和展开压缩数据的帮助程序
最后,我的数组是二维的
UArray和Repa支持高效的多维数组。Repa也有一个丰富的接口来实现这一点。向量本身并不存在
值得注意的是:
- ,一种自定义数组类型,具有到线性代数包的广泛绑定。应该绑定使用
或向量
类型repa
- ,从常规数组中获得更灵活的索引
- ,Andy Gill的用于处理二维图像的库
- ,将各种图像格式读写到UArray
如果有人知道如何将repa或类似的数组库直接与opencv一起使用,那就太好了。一旦我回顾了Haskell数组库对我来说很重要的特性,并进行了编译(仅电子表格:)。所以我试着回答 在Vector.unbox和UArray之间,我应该根据什么进行选择?它们都是非固定数组,但向量抽象似乎被大量宣传,尤其是在循环融合方面。向量总是更好吗?如果没有,我应该在什么时候使用哪种表示 如果需要二维或多维数组,UArray可能优于矢量。但是Vector有更好的API来处理向量。一般来说,向量不适合模拟多维阵列 Vector.unbox不能与并行策略一起使用。我怀疑UArray也不能使用,但至少