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 < d
和 j < mi
,我如何构建具有合适类型的东西作为 slice
的第二个参数 ,从中提取一个切片x
形状 shapeOfList [m_0, …, m_{i-1}, m_{i+1}, …, m_{d-1}]
由冻结索引号 i
在 j
?
定义
案例 d=2
中的示例为:
i=0
: 提取行 j
i=1
:提取列 j
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
和 All
表示。例如,要从矩阵中提取第 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 您想要提取的维度。
我在掌握 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 < d
和 j < mi
,我如何构建具有合适类型的东西作为 slice
的第二个参数 ,从中提取一个切片x
形状 shapeOfList [m_0, …, m_{i-1}, m_{i+1}, …, m_{d-1}]
由冻结索引号 i
在 j
?
案例 d=2
中的示例为:
i=0
: 提取行j
i=1
:提取列j
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
和 All
表示。例如,要从矩阵中提取第 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 您想要提取的维度。