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 (-)