6

Repa で、過去の値 (つまり、より小さいインデックス) に依存する配列を計算することは可能ですか? 配列の最初の部分 (例: a[0]) が与えられます。(配列の要素を示すために C に似た表記法を使用していることに注意してください。混同しないでください。)

チュートリアルを読んでハックをサクッと確認したのですが、それを行う機能が見つかりませんでした。

(この種の計算を 1D 配列で行うことは、Repa では並列化できないため意味がないと思います。ただし、2 次元以上の場合は並列化できると思います。)

編集f:おそらく、私が使用したい種類についてより具体的にする必要があります。がスカラーの場合は並列化する方法がないため、N 次元ベクトルa[i]の場合に注目しましょう。ベクトルに「展開」できるため、高次元 (行列など) であるa[i]必要はありません。a[i]つまり、fR^N を R^N にマップする関数です。

ほとんどの場合、次のようになります。

b = M a[i-1]
a[i][j] = g(b)[j]

ここbで、 は N 次元ベクトル、Mは N 行 N 列の行列 (まばらであることを前提としない)、およびgは何らかの非線形関数です。i=1,..N-1そして、与えられたa[0]gおよびに対してそれを計算したいと思いMます。(1)このタイプの計算を並列化し、(2)効率的な中間変数の割り当てを行うための一般的な方法があることを願っていbます(Cのような言語では、再利用できます。Repaまたは同様のライブラリは、純度を損なうことなく魔法のようにそれを行うことができます)。

4

2 に答える 2

3

これを行うRepaの方法がわかりません。しかし、Vector には次のようなものがあります。Data.Vector.iterateNは、必要なベクトルを構築します。次に、Data.Array.Repa.fromUnboxedで Vector から Repa に変換します。

iterateN :: Int -> (a -> a) -> a -> Vector aSource

O(n) 関数を値に n 回適用します。0 番目の要素は元の値です。

于 2012-06-28T10:14:19.233 に答える
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])

それを解剖する:

    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"

それを多次元配列に拡張するのは簡単です。

于 2012-06-27T21:05:40.497 に答える