Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [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)
- 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
- import Data.Array.Repa
- indexed arr = traverse arr id (src idx@(Z :. i) -> (src idx, i))
- minimize arr = foldP f h t
- where
- (Z :. n) = extent arr
- arr' = indexed arr
- h = arr' ! (Z :. 0)
- t = extract (Z :. 1) (Z :. (n-1)) arr'
- f min@(valMin, iMin) x@(val, i) | val < valMin = x
- | otherwise = min
- {-# LANGUAGE TypeOperators, FlexibleContexts #-}
- import Data.Array.Repa
- idx :: Int -> (Z :. Int)
- idx n = Z :. n
- (//) :: Source U e => Array U (Z :. Int) e -> Int -> e
- (//) v n = v ! (idx n)
- min' n v = m 0
- where m p | p == n - 1 = (v // p, p)
- | True = if x < x' then (x, p) else (x', p')
- where (x', p') = m (p + 1)
- x = v // p
- v2 :: Array U (Z :. Int) Int
- v2 = fromListUnboxed (idx 6) [7, 2, 9, 3, 0, 5]
- example = min' 6 v2
- -- OUT: (0, 4)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement