我刚开始研究Repa,想知道如何最好地实现通过模板操作读取/编写的环绕式环面2D阵列。我在使用ST monad和可变向量之前实现了此功能,但Repa似乎不支持此功能。几种方法似乎可行:

  • 我可以“遍历”数组,并在每个元素处进行索引包装。对于简单的模具,到处应用包装逻辑的成本非常高,因此我需要避免使用这种
  • Data.Array.Repa.Stencil不支持我需要的边界条件,但看起来像Data.Array.Repa.Algorithms.Convolve一样。文档显示,虽然
  • 有严重的性能损失
  • 据我了解,我可以使用切片遍历数组的一个子集。因此,我可以定义一个内部(1,1)-(w-2,h-2),两个水平和两个垂直平板代表边界,然后使用两个不同的功能/模板遍历它们,从而得到一个结果数组?是否有任何示例代码或其他文档?
  • Repa似乎也有“分区”的概念,可以将它们用于实现边界条件吗?

  • 哪一个最快?我缺少任何选择吗?

    谢谢!

    最佳答案

    最有效的方法是使用Partitioned数组表示形式(第4个选项),但是这样做很不方便,因为您应该手工处理5 areas

    Yarr中,您可以编写一个实用程序

    dim2WrapAround :: USource r l Dim2 a => UArray r l Dim2 a -> Dim2 -> Dim2 -> IO a
    {-# INLINE dim2WrapAround #-}
    dim2WrapAround arr (sizeX, sizeY) (posX, posY) =
        index arr (wrap sizeX posX, wrap sizeY posY)
      where wrap size pos = (pos + size) `mod` size
    
    -- I'm afraid to write the signature...
    {-# INLINE convolveOnThorus #-}
    convolveOnThorus = convolveLinearDim2WithStaticStencil dim2WrapAround
    

    用法:
    myConvolution :: UArray F L Dim2 Float -> UArray CV CVL Dim2 Float
    myConvolution = convolveOnThorus [dim2St| some
                                               coeffs
                                                   here |]
    

    关于arrays - 用Haskell的Repa实现2D Torus阵列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17913130/

    10-11 12:18