Repa 的切片和形状

Repa's slices and shapes

我在掌握 repa 的 Slice module, and specifically how its types and families are used with the slice 函数时遇到一些问题。我相信以下问题的答案会为我解决问题。

假设 x 的形状为 shapeOfList [m_0, m_1, …, m_{d-1}]。给定整数 i < dj < mi,我如何构建具有合适类型的东西作为 slice 的第二个参数 ,从中提取一个切片x 形状 shapeOfList [m_0, …, m_{i-1}, m_{i+1}, …, m_{d-1}] 由冻结索引号 ij?

定义

案例 d=2 中的示例为:

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 中使用关键字 AnyAll 表示。例如,要从矩阵中提取第 nth 行,语法为

nRow n =computeUnboxedS $ slice arr (Any :. n :. All) -- xs :: Array U DIM1 Double
 --   nRow 2 = fromList [6.0,7.0,8.0]

要提取第 nth 列,使用以下符号

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 ))

等等更高的维度。 另一方面,模板 Haskell 可以帮助 select 您想要提取的维度。