Haskell repa --- mapping with indices
想象一下,我想将一个函数映射到一个数组上,但该函数的类型不仅仅是
但
即该函数也需要一个索引。我该怎么做?
好问题,Repa 教程中没有记录它,所以我更新了它,增加了一个关于遍历的新部分。
特别是,
- 改变输出数组的形状
- 索引任何元素
- 观察当前元素
意味着您可以执行以下操作:
用它们的行索引替换所有元素
1 2 3 4 | > 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] |
将一个元素乘以它的行
1 2 3 4 | > 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] |
等等。
高级:并行图像去饱和度
Repa 教程中的示例
简答,使用
更长的例子:
1 2 3 4 5 6 7 8 9 | 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)) |
所以这里
使用 zipWith