Yro*_*irg 9 arrays haskell repa
想象一下,我想在一个数组上映射一个函数,但该函数不仅具有类型,
a -> b
而且
a -> Int -> b
函数也采用索引.我怎么做?
简短的回答,使用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))
Run Code Online (Sandbox Code Playgroud)
arr1是一个2x3的矩阵. traverse是一个函数,它采用(1)原始数组,(2)将源索引映射到目标索引的函数,以及(3)给出(i)查找函数到原始数组中的函数和(ii)索引的函数返回一个新值.
因此,这里arr2通过添加该特定条目的行和列索引来修改每个原始元素.
好的问题,并没有记录在修复教程中,所以我更新了一个关于遍历的新部分.
特别是,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]
Run Code Online (Sandbox Code Playgroud)
将元素乘以其行
> 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]
Run Code Online (Sandbox Code Playgroud)
等等.travese是非常强大的,也是神奇的平行.
高级:平行图像去饱和
| 归档时间: |
|
| 查看次数: |
3687 次 |
| 最近记录: |