10

関数を配列にマップしたいとしますが、その関数の型は of だけでは a -> b なく、 a -> Int -> b つまり、関数はインデックスもとります。それ、どうやったら出来るの?

4

3 に答える 3

8

短い答え、使用しますtraverse

より長い例:

import qualified Data.Array.Repa as A
import qualified Data.Vector.Unboxed as U

arr1 :: A.Array A.DIM2 Double
arr1 = A.fromVector (A.Z A.:. 2 A.:. 3) $ U.fromList [1::Double,2,3,4,5,6]

arr2 :: A.Array A.DIM2 Double
arr2 = A.traverse arr1 id (\lf i@(A.Z A.:. r A.:. c) -> 
                  (lf i) + (fromIntegral r) + (fromIntegral c))  

arr1は 2x3 行列です。 traverseは、(1) 元の配列、(2) ソース インデックスをターゲット インデックスにマッピングする関数、および (3) (i) 元の配列へのルックアップ関数と (ii) インデックスが与えられる関数を取る関数です。新しい値を返します。

したがって、ここでarr2は、その特定のエントリの行インデックスと列インデックスを追加して、元の各要素を変更します。

于 2011-06-05T11:15:31.557 に答える
8

良い質問です。Repa チュートリアルには記載されていなかったので、トラバーサルに関する新しいセクションで更新しました。

特に、次のtraverseことができます。

  • 出力配列の形状を変更する
  • 任意の要素にインデックスを付ける
  • 現在の要素を観察する

つまり、次のようなことができます。

すべての要素を行インデックスに置き換えます

> traverse a id (\_ (Z :. i :. j :. k) -> i) 
[0,0,0,0,0,0,0,0,0
,1,1,1,1,1,1,1,1,1
,2,2,2,2,2,2,2,2,2]

要素をその行で乗算します

> traverse a id (\f (Z :. i :. j :. k) -> f (Z :. i :. j :. k) * i) 
[0,0,0,0,0,0,0,0,0
,10,11,12,13,14,15,16,17,18
,38,40,42,44,46,48,50,52,54]

等々。非常にtravese強力で、魔法のように平行でもあります。

高度: 並列画像の彩度低下

Repa チュートリアルの例

于 2011-06-05T14:45:54.403 に答える