module Numeric.LinearAlgebra.Interface(
(<>),(<.>),
(<\>),
(.*),(*/),
(<|>),(<->),
) where
import Numeric.LinearAlgebra.Linear
import Data.Packed.Vector
import Data.Packed.Matrix
import Numeric.LinearAlgebra.Algorithms
class Mul a b c | a b -> c where
infixl 7 <>
(<>) :: Element t => a t -> b t -> c t
instance Mul Matrix Matrix Matrix where
(<>) = multiply
instance Mul Matrix Vector Vector where
(<>) m v = flatten $ m <> (asColumn v)
instance Mul Vector Matrix Vector where
(<>) v m = flatten $ (asRow v) <> m
(<.>) :: (Element t) => Vector t -> Vector t -> t
infixl 7 <.>
(<.>) = dot
(.*) :: (Linear c a) => a -> c a -> c a
infixl 7 .*
a .* x = scale a x
(*/) :: (Linear c a) => c a -> a -> c a
infixl 7 */
v */ x = scale (recip x) v
(<\>) :: (Field a) => Matrix a -> Vector a -> Vector a
infixl 7 <\>
m <\> v = flatten (linearSolveSVD m (reshape 1 v))
class Joinable a b where
joinH :: Element t => a t -> b t -> Matrix t
joinV :: Element t => a t -> b t -> Matrix t
instance Joinable Matrix Matrix where
joinH m1 m2 = fromBlocks [[m1,m2]]
joinV m1 m2 = fromBlocks [[m1],[m2]]
instance Joinable Matrix Vector where
joinH m v = joinH m (asColumn v)
joinV m v = joinV m (asRow v)
instance Joinable Vector Matrix where
joinH v m = joinH (asColumn v) m
joinV v m = joinV (asRow v) m
infixl 4 <|>
infixl 3 <->
(<|>) :: (Element t, Joinable a b) => a t -> b t -> Matrix t
a <|> b = joinH a b
(<->) :: (Element t, Joinable a b) => a t -> b t -> Matrix t
a <-> b = joinV a b