在GNU八度的代碼 -Haskell repa - 如何減少數組和返回索引?
[e, ix] = min(X);
將返回最小元素,它的位置。 你如何在修復任意二進制函數?
這是我想出了:
min x = z $ foldl' f (e,0,0) es
where
(e:es) = toList x
f (a,ix,r) b = let ix' = ix+1 in if a < b then (a,ix',r) else (b,ix',ix')
z (a,ix,r) = (a,r)
在上面的例子中,我們轉換repA的1D矩陣列表,然後使用與foldl」(從Data.List模塊)與兩個累加器 - 一個用於計算迭代(IX )和其他保存最小元素(r)的位置。但使用repa的全部重點是使用數組,而不是列表!
在修復中,數組類型(foldS和foldP)有兩個摺疊 - 但它們只能使用類型的函數(a - > a - > a) - 意思是說,我不能將具有累加器的元組傳遞給它。還有遍歷,它可以在原則上,一維數組減少對標量數組:
min x = traverse x to0D min
where
to0D (Z:.i) = Z
min f (Z) = ??? -- how to get elements for comparison?
,想到的第一件事是
[f (Z:.i) | i <- [1..n]], where n = (\(Z:.i) -> i) $ extent x
但是,這也將轉換數組列表,而不是在數組上進行計算。
對於repa還不是很熟悉,但是在使用'foldP?'之前,不能將每個項目映射到一個元組。例如,可以使用最小元素的元組,最小元素的索引和子數組的長度來描述子數組。所以你把每個元素'x'映射到'(x,0,1)',然後使用'f(x,i,n)(y,j,m)=並行摺疊如果x
hammar
對不起,那當然應該是'maxBound'。 – hammar
爲了在一個元組中使用foldP,你必須有這些元組的數組。它可以完成,但是這對圖像處理(數百萬個元素)是一種浪費。 – EvgenijM86