gpt4 book ai didi

haskell - 修复:对列进行 ZipWith'ing

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

我想知道是否有更快/更好的方法来编写以下 repa 函数

zipOverColumns ::  (Source r1 a, Source r2 b) 
=> (a -> b -> c)
-> Array r1 DIM1 a
-> Array r2 DIM2 b
-> Array D DIM2 c
zipOverColumns f x y = traverse y id lookup where
lookup get sh@(Z :. _ :. r) = f (x ! (Z :. r)) $ get sh

这是一些示例输出

>>> toList $ zipOverColumns (*) (fromListUnboxed (Z :. 3)      [1,2,3]) 
(fromListUnboxed (Z :. 2 :. 3) [4,5,6,7,8,9])
[4.0,10.0,18.0,7.0,16.0,27.0]

最佳答案

在 Repa 3 环境中,您的实现是性能最佳的。您可能会发现以下版本更具可读性:

zipOverColumns2
:: (Source r1 a, Source r2 b)
=> (a -> b -> c)
-> Array r1 DIM1 a
-> Array r2 DIM2 b
-> Array D DIM2 c
zipOverColumns2 f col arr = zipWith f ccol arr
where
ccol = fromFunction (extent arr) (\(Z :. _ :. r) -> col ! (Z :. r))

zipOverColumns2 也比原来快了 15%,但这只是巧合。

使用yarr,函数如下所示:

zipOverColumns
:: (USource r1 l1 Dim1 a,
USource r2 l2 Dim2 b, DefaultIFusion r2 l2 fr fl Dim2,
USource fr fl Dim2 c)
=> (a -> b -> c)
-> UArray r1 l1 Dim1 a
-> UArray r2 l2 Dim2 b
-> UArray fr fl Dim2 c
zipOverColumns f col arr = imapM mapF arr
where
mapF (r, _) b = do
a <- col `index` r
return $ f a b

这个版本的速度提高了 30% 到 85%,具体取决于列大小(我测试了 4、8 和 1000)。 Gist玩它。

关于haskell - 修复:对列进行 ZipWith'ing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15595140/

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