首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Repa:用ZipWith‘over Columns

Repa:用ZipWith‘over Columns
EN

Stack Overflow用户
提问于 2013-03-24 12:25:03
回答 1查看 227关注 0票数 3

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

代码语言:javascript
复制
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

以下是一些示例输出

代码语言:javascript
复制
>>> 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]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-24 18:06:01

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

代码语言:javascript
复制
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时,该函数如下所示:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15595140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档