gpt4 book ai didi

arrays - 对于具有数百万像素的 2D、未装箱像素阵列,建议使用什么 Haskell 表示法?

转载 作者:行者123 更新时间:2023-12-02 20:57:08 24 4
gpt4 key购买 nike

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

  1. 我应该根据什么在 Vector.UnboxedUArray 之间进行选择?它们都是未装箱的数组,但 Vector 抽象似乎被大力宣传,特别是在循环融合方面。 Vector 总是更好吗?如果没有,我什么时候应该使用哪种表示形式?

  2. 对于彩色图像,我希望存储 16 位整数的三元组或单精度 float 的三元组。为此,VectorUArray 哪个更容易使用?性能更高?

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

  4. 最后,我的数组是二维的。我想我可以处理由“数组的数组”(或向量的向量)表示形式带来的额外间接性,但我更喜欢具有索引映射支持的抽象。任何人都可以推荐标准库或 Hackage 中的任何内容吗?

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

最佳答案

对于多维数组,我认为 Haskell 目前最好的选择是 repa

Repa provides high performance, regular, multi-dimensional, shape polymorphic parallel arrays. All numeric data is stored unboxed. Functions written with the Repa combinators are automatically parallel provided you supply +RTS -Nwhatever on the command line when running the program.

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

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

repa-io软件包包括对读取和写入 .bmp 图像文件的支持,但需要支持更多格式。

为了解决您的具体问题,这里有一个带有讨论的图表:

<小时/>

All three of UArray, Vector, and Repa support unboxing. Vector and Repa have a rich, flexible API, but UArray does not. UArray and Repa have multi-dimensional indexing, but Vector does not. They all have support for bit-packing, although Vector and Repa have some caveats in that regard. Vector and Repa interoperate with C data and code, but UArray does not. Only Repa supports stencils.

<小时/>

我应该根据什么在 Vector.Unboxed 和 UArray 之间进行选择?

它们具有大致相同的底层表示,但是,主要区别在于用于处理向量的 API 的广度:它们几乎具有您通常与列表关联的所有操作(使用融合驱动的优化框架),而UArray几乎没有API。

对于彩色图像,我希望存储 16 位整数的三元组或单精度 float 的三元组。

UArray 对多维数据有更好的支持,因为它可以使用任意数据类型进行索引。虽然这在 Vector 中是可能的(通过为您的元素类型编写 UA 实例),但这不是 Vector 的主要目标 - - 相反,这就是 Repa 介入的地方,借助 shape 索引,可以非常轻松地使用以高效方式存储的自定义数据类型。

Repa 中,您的三条短裤将具有以下类型:

Array DIM3 Word16

即 Word16 的 3D 数组。

对于双色调图像,我只需要为每个像素存储 1 位。

UArray 将 Bool 打包为位,Vector 使用 Bool 的实例进行位打包,而不是使用基于 Word8 的表示。然而,为向量编写位打包实现很容易 - here is one ,来自(过时的)uvector 库。在底层,Repa 使用 Vectors,因此我认为它继承了库表示选择。

是否有预定义的数据类型可以帮助我将多个像素打包到一个单词中

您可以将现有实例用于任何库、不同的字类型,但您可能需要使用 Data.Bits 编写一些帮助程序来滚动和展开打包数据。

最后,我的数组是二维的

UArray和Repa支持高效的多维数组。 Repa 还拥有丰富的界面来执行此操作。矢量本身则不然。

<小时/>

值得注意的提及:

  • hmatrix ,一种自定义数组类型,与线性代数包有广泛的绑定(bind)。应绑定(bind)使用 vectorrepa 类型。
  • ix-shapeable ,从常规数组中获得更灵活的索引
  • chalkboard , Andy Gill 的用于操作 2D 图像的库
  • codec-image-devil 、读取和写入各种图像格式到UArray

关于arrays - 对于具有数百万像素的 2D、未装箱像素阵列,建议使用什么 Haskell 表示法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com