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 bnds f = array bnds $ map (\i -> (i, f i)) $ range bnds
fromList :: [a] -> Array Int a
fromList xs = listArray (0, length xs 1) xs
toList :: Array Int a -> [a]
toList = elems
norm :: (Ix i, Floating a) => Array i a -> a
norm = sqrt . sum . elems . fmap (^!2)
scale :: (Ix i, Num a) => a -> Array i a -> Array i a
scale x = fmap (x*)
lift2 :: (Ix i) => (a -> b -> c) -> Array i a -> Array i b -> Array i c
lift2 f x y =
if bounds x == bounds y
then array (bounds x) [ (k, f xk (y!k)) | (k, xk) <- assocs x ]
else error "Vector.lift2: matrix dimensions mismatch"
add :: (Ix i, Num a) => Array i a -> Array i a -> Array i a
add = lift2 (+)
sub :: (Ix i, Num a) => Array i a -> Array i a -> Array i a
sub = lift2 ()