2015-11-02 50 views
4

Repa的所有約簡函數都可以折回與數組內容相同的類型。例如:如何將Repa數組摺疊爲任意值?

foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a 
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a 

我想折repA的數組轉換成一個數據結構,我可以傳遞給GUI庫來呈現,即,任意的值,但在庫中做我不能找到一個功能這個。這個函數是否存在,還是必須使用[... | x <- [0..w-1], y <- [0..h-1]]迭代單元格?

+1

您是否有具體的例子來說明您想要做什麼? – ErikR

+0

您可以使用'hmatrix-repa'軟件包將其轉換爲'hmatrix'數組,該數組是無操作轉換爲C型數組的。或者你可以從'hmatrix-repa'複製代碼,它很小。 – vivian

+1

如果函數是關聯的,並且零值必須是左和右身份,摺疊修復數組纔有意義,因爲函數「foldAllP」和「foldAllS」不能保證元素關聯的順序。事實上,'foldAllP'可以在每次調用時自由選擇一個*不同的關聯。 – user2407038

回答

0

惹巴不允許摺疊在任何特定方向,因爲在並行計算:

foldAllP:操作者的應用程序被任意地相關聯。

在另一方面,摺疊順序不應強加限制於蓄能器​​是相同類型的數組元素,但不幸的是它也與foldAllS的情況。

通過回退到底層向量包,即使用toUnboxed將純數組轉換爲無箱向量,然後使用vector程序包功能,有一個非常簡單的解決方法。顯然,這意味着摺疊不會同時完成,但它仍然比使用列表快得多。示例:

λ> import qualified Data.Vector.Unboxed as V 
λ> :t V.foldr 
V.foldr :: Unbox a => (a -> b -> b) -> b -> Vector a -> b 
λ> :t V.foldl 
V.foldl :: Unbox b => (a -> b -> a) -> a -> Vector b -> a 
λ> V.foldr ((&&) . (>0.5)) True $ toUnboxed repaArray