diff options
Diffstat (limited to 'lib/Numeric/LinearAlgebra/Linear.hs')
-rw-r--r-- | lib/Numeric/LinearAlgebra/Linear.hs | 90 |
1 files changed, 87 insertions, 3 deletions
diff --git a/lib/Numeric/LinearAlgebra/Linear.hs b/lib/Numeric/LinearAlgebra/Linear.hs index 51e93fb..ae48245 100644 --- a/lib/Numeric/LinearAlgebra/Linear.hs +++ b/lib/Numeric/LinearAlgebra/Linear.hs | |||
@@ -19,15 +19,19 @@ module Numeric.LinearAlgebra.Linear ( | |||
19 | -- * Linear Algebra Typeclasses | 19 | -- * Linear Algebra Typeclasses |
20 | Vectors(..), | 20 | Vectors(..), |
21 | Linear(..), | 21 | Linear(..), |
22 | -- * Products | ||
23 | Prod(..), | ||
24 | mXm,mXv,vXm, mulH, | ||
25 | outer, kronecker, | ||
22 | -- * Creation of numeric vectors | 26 | -- * Creation of numeric vectors |
23 | constant, linspace | 27 | constant, linspace |
24 | ) where | 28 | ) where |
25 | 29 | ||
26 | import Data.Packed.Internal.Vector | 30 | import Data.Packed.Internal |
27 | import Data.Packed.Internal.Matrix | ||
28 | import Data.Packed.Matrix | 31 | import Data.Packed.Matrix |
29 | import Data.Complex | 32 | import Data.Complex |
30 | import Numeric.GSL.Vector | 33 | import Numeric.GSL.Vector |
34 | import Numeric.LinearAlgebra.LAPACK(multiplyR,multiplyC,multiplyF,multiplyQ) | ||
31 | 35 | ||
32 | import Control.Monad(ap) | 36 | import Control.Monad(ap) |
33 | 37 | ||
@@ -86,7 +90,7 @@ instance Vectors Vector (Complex Double) where | |||
86 | ---------------------------------------------------- | 90 | ---------------------------------------------------- |
87 | 91 | ||
88 | -- | Basic element-by-element functions. | 92 | -- | Basic element-by-element functions. |
89 | class (Element e, AutoReal e, Convert e, Container c) => Linear c e where | 93 | class (Element e, AutoReal e, Container c) => Linear c e where |
90 | -- | create a structure with a single element | 94 | -- | create a structure with a single element |
91 | scalar :: e -> c e | 95 | scalar :: e -> c e |
92 | scale :: e -> c e -> c e | 96 | scale :: e -> c e -> c e |
@@ -184,3 +188,83 @@ linspace :: (Enum e, Linear Vector e) => Int -> (e, e) -> Vector e | |||
184 | linspace n (a,b) = addConstant a $ scale s $ fromList [0 .. fromIntegral n-1] | 188 | linspace n (a,b) = addConstant a $ scale s $ fromList [0 .. fromIntegral n-1] |
185 | where s = (b-a)/fromIntegral (n-1) | 189 | where s = (b-a)/fromIntegral (n-1) |
186 | 190 | ||
191 | ---------------------------------------------------- | ||
192 | |||
193 | -- reference multiply | ||
194 | mulH a b = fromLists [[ doth ai bj | bj <- toColumns b] | ai <- toRows a ] | ||
195 | where doth u v = sum $ zipWith (*) (toList u) (toList v) | ||
196 | |||
197 | class Element t => Prod t where | ||
198 | multiply :: Matrix t -> Matrix t -> Matrix t | ||
199 | multiply = mulH | ||
200 | ctrans :: Matrix t -> Matrix t | ||
201 | |||
202 | instance Prod Double where | ||
203 | multiply = multiplyR | ||
204 | ctrans = trans | ||
205 | |||
206 | instance Prod (Complex Double) where | ||
207 | multiply = multiplyC | ||
208 | ctrans = conj . trans | ||
209 | |||
210 | instance Prod Float where | ||
211 | multiply = multiplyF | ||
212 | ctrans = trans | ||
213 | |||
214 | instance Prod (Complex Float) where | ||
215 | multiply = multiplyQ | ||
216 | ctrans = conj . trans | ||
217 | |||
218 | ---------------------------------------------------------- | ||
219 | |||
220 | -- synonym for matrix product | ||
221 | mXm :: Prod t => Matrix t -> Matrix t -> Matrix t | ||
222 | mXm = multiply | ||
223 | |||
224 | -- matrix - vector product | ||
225 | mXv :: Prod t => Matrix t -> Vector t -> Vector t | ||
226 | mXv m v = flatten $ m `mXm` (asColumn v) | ||
227 | |||
228 | -- vector - matrix product | ||
229 | vXm :: Prod t => Vector t -> Matrix t -> Vector t | ||
230 | vXm v m = flatten $ (asRow v) `mXm` m | ||
231 | |||
232 | {- | Outer product of two vectors. | ||
233 | |||
234 | @\> 'fromList' [1,2,3] \`outer\` 'fromList' [5,2,3] | ||
235 | (3><3) | ||
236 | [ 5.0, 2.0, 3.0 | ||
237 | , 10.0, 4.0, 6.0 | ||
238 | , 15.0, 6.0, 9.0 ]@ | ||
239 | -} | ||
240 | outer :: (Prod t) => Vector t -> Vector t -> Matrix t | ||
241 | outer u v = asColumn u `multiply` asRow v | ||
242 | |||
243 | {- | Kronecker product of two matrices. | ||
244 | |||
245 | @m1=(2><3) | ||
246 | [ 1.0, 2.0, 0.0 | ||
247 | , 0.0, -1.0, 3.0 ] | ||
248 | m2=(4><3) | ||
249 | [ 1.0, 2.0, 3.0 | ||
250 | , 4.0, 5.0, 6.0 | ||
251 | , 7.0, 8.0, 9.0 | ||
252 | , 10.0, 11.0, 12.0 ]@ | ||
253 | |||
254 | @\> kronecker m1 m2 | ||
255 | (8><9) | ||
256 | [ 1.0, 2.0, 3.0, 2.0, 4.0, 6.0, 0.0, 0.0, 0.0 | ||
257 | , 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 0.0, 0.0, 0.0 | ||
258 | , 7.0, 8.0, 9.0, 14.0, 16.0, 18.0, 0.0, 0.0, 0.0 | ||
259 | , 10.0, 11.0, 12.0, 20.0, 22.0, 24.0, 0.0, 0.0, 0.0 | ||
260 | , 0.0, 0.0, 0.0, -1.0, -2.0, -3.0, 3.0, 6.0, 9.0 | ||
261 | , 0.0, 0.0, 0.0, -4.0, -5.0, -6.0, 12.0, 15.0, 18.0 | ||
262 | , 0.0, 0.0, 0.0, -7.0, -8.0, -9.0, 21.0, 24.0, 27.0 | ||
263 | , 0.0, 0.0, 0.0, -10.0, -11.0, -12.0, 30.0, 33.0, 36.0 ]@ | ||
264 | -} | ||
265 | kronecker :: (Prod t) => Matrix t -> Matrix t -> Matrix t | ||
266 | kronecker a b = fromBlocks | ||
267 | . splitEvery (cols a) | ||
268 | . map (reshape (cols b)) | ||
269 | . toRows | ||
270 | $ flatten a `outer` flatten b | ||