Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 对于具有数百万像素的二维非固定像素阵列,建议使用什么Haskell表示法?_Arrays_Haskell_Image Processing_Bitmap - Fatal编程技术网

Arrays 对于具有数百万像素的二维非固定像素阵列,建议使用什么Haskell表示法?

Arrays 对于具有数百万像素的二维非固定像素阵列,建议使用什么Haskell表示法?,arrays,haskell,image-processing,bitmap,Arrays,Haskell,Image Processing,Bitmap,我想在Haskell中解决一些图像处理问题。我正在处理具有数百万像素的双色(位图)和彩色图像。我有几个问题: 在Vector.unbox和UArray之间,我应该根据什么进行选择?它们都是非固定数组,但是向量抽象似乎被大量宣传,尤其是循环融合。Vector是否总是更好?如果没有,什么时候应该使用哪种表示法? 对于彩色图像,我希望存储16位整数的三倍或单精度浮点数的三倍。为此,Vector或UArray是否更易于使用?性能更好 对于双色图像,我只需要每像素存储1位。是否有一个预定义的数据类型可以通

我想在Haskell中解决一些图像处理问题。我正在处理具有数百万像素的双色(位图)和彩色图像。我有几个问题:

  • Vector.unbox
    UArray
    之间,我应该根据什么进行选择?它们都是非固定数组,但是
    向量
    抽象似乎被大量宣传,尤其是循环融合。
    Vector
    是否总是更好?如果没有,什么时候应该使用哪种表示法?

  • 对于彩色图像,我希望存储16位整数的三倍或单精度浮点数的三倍。为此,
    Vector
    UArray
    是否更易于使用?性能更好

  • 对于双色图像,我只需要每像素存储1位。是否有一个预定义的数据类型可以通过将多个像素打包到一个单词中来帮助我,还是我自己

  • 最后,我的数组是二维的。我想我可以处理表示为“数组数组”(或向量向量)所施加的额外间接性,但我更喜欢具有索引映射支持的抽象。有人能从标准图书馆或黑客网站推荐什么吗


  • 我是一名函数式程序员,不需要变异:-)

    对于多维数组,在我看来,Haskell当前的最佳选择是

    Repa提供高性能、规则、多维、形状多态的并行阵列。所有数字数据都是以不装箱的方式存储的。如果在运行程序时在命令行上提供+RTS-nwhatver,则使用Repa组合器编写的函数将自动并行

    最近,它已用于一些图像处理问题:

    我已经开始写,如果您已经了解Haskell数组或向量库,那么这是一个很好的开始。关键的垫脚石是使用形状类型而不是简单的索引类型来处理多维索引(甚至模板)

    该软件包支持读取和写入.bmp图像文件,但需要支持更多格式

    针对您的具体问题,以下是一张带有讨论的图表:



    在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

    虽然,这并不能完全回答您的问题,也不是haskell的问题,但我还是建议您在hackage上看看或库。它们结合了opencv库中许多非常有用的图像处理和视觉操作员,使处理机器视觉问题的速度更快


    如果有人知道如何将repa或类似的数组库直接与opencv一起使用,那就太好了。

    一旦我回顾了Haskell数组库对我来说很重要的特性,并进行了编译(仅电子表格:)。所以我试着回答

    在Vector.unbox和UArray之间,我应该根据什么进行选择?它们都是非固定数组,但向量抽象似乎被大量宣传,尤其是在循环融合方面。向量总是更好吗?如果没有,我应该在什么时候使用哪种表示

    如果需要二维或多维数组,UArray可能优于矢量。但是Vector有更好的API来处理向量。一般来说,向量不适合模拟多维阵列

    Vector.unbox不能与并行策略一起使用。我怀疑UArray也不能使用,但至少