gpt4 book ai didi

haskell - 如何将 Repa 数组折叠成任意值?

转载 作者:行者123 更新时间:2023-12-02 02:47:44 25 4
gpt4 key购买 nike

Repa的所有归约函数折叠回与数组内容相同的类型。例如:

foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a

我想将 repa 数组折叠成一个数据结构,我可以将其传递给 GUI 库进行渲染,即任意值,但我在库中找不到执行此操作的函数。这个函数是否存在或者我是否必须使用 [... | x <- [0..w-1], y <- [0..h-1]] 迭代单元格? ?

最佳答案

Repa 不允许您向任何特定方向折叠,因为在并行计算期间:

foldAllP: Applications of the operator are associated arbitrarily.



另一方面,顺序折叠不应该限制累加器与数组元素的类型相同,但不幸的是, foldAllS 也是这种情况。 .

通过回退到底层向量包,有一个非常简单的解决方法,即使用 toUnboxed 将 repa 数组转换为未装箱的向量。然后只需使用 vector包功能。显然,这意味着折叠不会并行完成,但它仍然比使用列表快得多。例子:
λ>  import qualified Data.Vector.Unboxed as V
λ> :t V.foldr
V.foldr :: Unbox a => (a -> b -> b) -> b -> Vector a -> b
λ> :t V.foldl
V.foldl :: Unbox b => (a -> b -> a) -> a -> Vector b -> a
λ> V.foldr ((&&) . (>0.5)) True $ toUnboxed repaArray

关于haskell - 如何将 Repa 数组折叠成任意值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33470647/

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