我刚开始研究Repa,想知道如何最好地实现通过模板操作读取/编写的环绕式环面2D阵列。我在使用ST monad和可变向量之前实现了此功能,但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/