我正在使用Repa編寫地形生成器。發生器首先創建一個DIM2
接地片,並且我希望能夠在其上添加DIM2
片以創建DIM3
陣列。將較低維度的切片與較高維度相結合修復陣列
想象一個3x3x3盒子。如果我有3x3的切片,我可以將切片放在盒子的頂部以垂直增長。這正是我想要用Repa做的事情。我有一個似乎用traverse2
工作的實現:
stack :: (Shape sh, Source r c, Source r2 c)
=> Array r (sh :. Int) c -> Array r2 sh c -> Array D (sh :. Int) c
stack arr1 arr2 = traverse2 arr1 arr2 resize $ \f g [email protected](sh' :. _) ->
if extent arr1 `inShape` sh then f sh else g sh'
where resize :: Shape (sh :. Int) => (sh :. Int) -> t -> (sh :. Int)
resize (xs :. x) _ = xs :. (x + 1)
這將構建具有較高維數組的同一維度的新數組,結果數組的大小在更高的層面增加了一個。
即。 stack (3x3x3 box :: DIM3) (3x3 slice :: DIM2) == (3x3x4 box :: DIM3)
該方法需要對兩個數組進行全面遍歷,並且非常混亂且可能出錯。有更清潔,更有效的方法來將低維Repa陣列與更高維數組合在一起嗎?