module Matrix.Vector where import DSP.Basic ((^!)) import Data.Array (Array, Ix, bounds, elems, range, array, assocs, listArray, (!), ) generate :: (Ix i) => (i,i) -> (i -> a) -> Array i a generate :: forall i a. Ix i => (i, i) -> (i -> a) -> Array i a generate (i, i) bnds i -> a f = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e array (i, i) bnds forall a b. (a -> b) -> a -> b $ forall a b. (a -> b) -> [a] -> [b] map (\i i -> (i i, i -> a f i i)) forall a b. (a -> b) -> a -> b $ forall a. Ix a => (a, a) -> [a] range (i, i) bnds fromList :: [a] -> Array Int a fromList :: forall a. [a] -> Array Int a fromList [a] xs = forall i e. Ix i => (i, i) -> [e] -> Array i e listArray (Int 0, forall (t :: * -> *) a. Foldable t => t a -> Int length [a] xs forall a. Num a => a -> a -> a - Int 1) [a] xs toList :: Array Int a -> [a] toList :: forall a. Array Int a -> [a] toList = forall i e. Array i e -> [e] elems norm :: (Ix i, Floating a) => Array i a -> a norm :: forall i a. (Ix i, Floating a) => Array i a -> a norm = forall a. Floating a => a -> a sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a sum forall b c a. (b -> c) -> (a -> b) -> a -> c . forall i e. Array i e -> [e] elems forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (forall a. Num a => a -> Int -> a ^!Int 2) scale :: (Ix i, Num a) => a -> Array i a -> Array i a scale :: forall i a. (Ix i, Num a) => a -> Array i a -> Array i a scale a x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (a xforall a. Num a => a -> a -> a *) lift2 :: (Ix i) => (a -> b -> c) -> Array i a -> Array i b -> Array i c lift2 :: forall i a b c. Ix i => (a -> b -> c) -> Array i a -> Array i b -> Array i c lift2 a -> b -> c f Array i a x Array i b y = if forall i e. Array i e -> (i, i) bounds Array i a x forall a. Eq a => a -> a -> Bool == forall i e. Array i e -> (i, i) bounds Array i b y then forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e array (forall i e. Array i e -> (i, i) bounds Array i a x) [ (i k, a -> b -> c f a xk (Array i b yforall i e. Ix i => Array i e -> i -> e !i k)) | (i k, a xk) <- forall i e. Ix i => Array i e -> [(i, e)] assocs Array i a x ] else forall a. HasCallStack => [Char] -> a error [Char] "Vector.lift2: matrix dimensions mismatch" add :: (Ix i, Num a) => Array i a -> Array i a -> Array i a add :: forall i a. (Ix i, Num a) => Array i a -> Array i a -> Array i a add = forall i a b c. Ix i => (a -> b -> c) -> Array i a -> Array i b -> Array i c lift2 forall a. Num a => a -> a -> a (+) sub :: (Ix i, Num a) => Array i a -> Array i a -> Array i a sub :: forall i a. (Ix i, Num a) => Array i a -> Array i a -> Array i a sub = forall i a b c. Ix i => (a -> b -> c) -> Array i a -> Array i b -> Array i c lift2 (-)