2

我在理解 repa 的Slice模块时遇到了一些麻烦,特别是它的类型和系列如何与该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是:

  • i=0: 提取行j
  • i=1: 提取列j
4

1 回答 1

1
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 中使用关键字Anyand表示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 可以在这里帮助您选择要提取的维度。

于 2015-05-14T14:36:09.537 回答