let arr = fromListUnboxed (ix2 3 3) [0..8] :: Array U DIM2 Double
shapeOfList
例如,将列表转换为索引
shapeOfList [2,2] == (ix2 2 2) -- (Z:. 2 :.2)
xs ! shapeOfList [2,2] == 8.0
但是该函数slice
需要一个索引范围,并且这个索引范围在 REPA 中使用关键字Any
and表示All
。例如,要从 Matrix 中提取第n行,语法为
nRow n =computeUnboxedS $ slice arr (Any :. n :. All) -- xs :: Array U DIM1 Double
-- nRow 2 = fromList [6.0,7.0,8.0]
要提取第n列,使用以下符号
nCol n = computeUnboxedS $ slice arr (Any :. n ) -- xs :: Array U DIM1 Double
-- nCol 2 = fromList [2.0,5.0,8.0]
令人困惑的是,在 REPA 词汇表中,数组索引(Z:.i:.i)和索引范围(Any:.n:.All)都称为形状,但一个只表示一个元素索引,而另一个表示一组索引。
编辑
ith
从数组中提取维度traverse
似乎是正确的功能,例如对于 3 维
-- k = 3 and m = 0
fun3D_i arr = traverse arr (\(Z :. _ :. j :. k ) -> (Z:. j :. k)) (\f (Z :. j :. k ) -> f (Z :. 0 :. j :. k ))`
-- k = 3 and m = 1
fun3D_j arr = traverse arr (\(Z :. i :. _ :. k ) -> (Z:. i :. k)) (\f (Z :. i :. k ) -> f (Z :. i :. 0 :. k ))
-- k = 3 and m = 2
fun3D_k arr = traverse arr (\(Z :. i :. j :. _ ) -> (Z:. i :. j)) (\f (Z :. i :. j ) -> f (Z :. i :. j :. 0 ))
等等更高维度。另一方面,Template Haskell 可以在这里帮助您选择要提取的维度。