你如何在Repa中计算[i] = f(a [i-1])?

tkf*_*tkf 6 haskell repa

可以在Repa中计算一个依赖于过去值(即较小索引)的数组吗?给出了阵列的初始部分(例如a[0]).(注意我使用类似C的表示法来表示数组的元素;请不要混淆.)

我阅读了教程并快速检查了hackage但我找不到一个功能来完成它.

(我想在一维数组中进行这种计算并不会导致修复,因为你无法对其进行并行化.但我认为你可以在2维或更多维的情况下并行化它.)

编辑:可能我应该更具体地说明f我想要使​​用什么样的.由于在a[i]标量的情况下没有办法并行化,所以让我们关注的a[i]是N dim向量.我不需要a[i]更高维度(例如矩阵)因为你可以将它"展开"到矢量.因此,f是将R ^ N映射到R ^ N的函数.

大多数情况下,它是这样的:

b = M a[i-1]
a[i][j] = g(b)[j]
Run Code Online (Sandbox Code Playgroud)

其中b是N dim向量,M是N×N矩阵(没有稀疏性假设),并且g是一些非线性函数.我想为i=1,..N-1给定的计算它a[0],g并且M.我希望有一些通用的方法来(1)并行化这种类型的计算和(2)分配中间变量,如b高效(在类C语言中,你可以只重复使用它,如果修复或类似的图书馆可以做到像魔术一样不破坏纯度).

lbo*_*lla 1

编辑:实际上,我认为我误解了这个问题。我会在这里留下我的答案,以防对其他人有用......

您可以使用traverse http://hackage.haskell.org/packages/archive/repa/3.2.1.1/doc/html/Data-Array-Repa.html#v:traverse

Prelude Data.Array.Repa R> let x = fromListUnboxed (Z :. 10 :: DIM1) [1..10]
Prelude Data.Array.Repa R> R.computeUnboxedS $ R.traverse x (\ (Z :. i) -> (Z :. (i - 1))) (\f  (Z :. i) -> f (Z :. (i + 1)) - f (Z :. i))
AUnboxed (Z :. 9) (fromList [1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0])
Run Code Online (Sandbox Code Playgroud)

剖析它:

    R.computeUnboxedS $                            -- force the vector to be "real"
    R.traverse x                                   -- traverse the vector
    (\ (Z :. i) -> (Z :. (i - 1)))                 -- function to get the shape of the result
    (\f (Z :. i) -> f (Z :. (i + 1)) - f (Z :. i)) -- actual "stencil"
Run Code Online (Sandbox Code Playgroud)

将其扩展到多维数组应该是微不足道的。