積分画像を計算するために、Repa を使用して累積合計関数を実装しようとしています。私の現在の実装は次のようになります。
cumsum :: (Elt a, Num a) => Array DIM2 a -> Array DIM2 a
cumsum array = traverse array id cumsum'
where
elementSlice inner outer = slice array (inner :. (0 :: Int))
cumsum' f (inner :. outer) = Repa.sumAll $ elementSlice inner outer
問題は elementSlice 関数にあります。matlab または numpy では、これは array[inner,0:outer] として指定できます。だから私が探しているのは、次のようなものです:
slice array (inner :. (Range 0 outer))
ただ、現在 Repa ではスライスを範囲指定することはできないようです。Haskell での効率的な並列ステンシル畳み込みで説明されているように、パーティションの使用を検討しましたが、反復ごとに変更される場合、これはかなり重量級のアプローチのように思えます。また、スライスをマスキングすることも検討しました (バイナリ ベクトルを乗算する) - しかし、行列内のすべての点にマスク ベクトルを割り当てるため、大きな行列ではパフォーマンスが非常に悪いように思えました...
私の質問 - Repa に範囲でのスライスのサポートを追加する計画があるかどうか誰か知っていますか? または、おそらく別のアプローチで、この問題にすでに対処できるパフォーマンスの高い方法はありますか?