summaryrefslogtreecommitdiff
path: root/packages/hmatrix/src/Numeric/LinearAlgebra
diff options
context:
space:
mode:
Diffstat (limited to 'packages/hmatrix/src/Numeric/LinearAlgebra')
-rw-r--r--packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs136
-rw-r--r--packages/hmatrix/src/Numeric/LinearAlgebra/IO.hs42
-rw-r--r--packages/hmatrix/src/Numeric/LinearAlgebra/Random.hs84
3 files changed, 262 insertions, 0 deletions
diff --git a/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs b/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
new file mode 100644
index 0000000..1fde621
--- /dev/null
+++ b/packages/hmatrix/src/Numeric/LinearAlgebra/GSL.hs
@@ -0,0 +1,136 @@
1-----------------------------------------------------------------------------
2-- |
3-- Module : Numeric.LinearAlgebra.GSL
4-- Copyright : (c) Alberto Ruiz 2007-14
5-- License : GPL
6-- Maintainer : Alberto Ruiz
7-- Stability : provisional
8--
9-----------------------------------------------------------------------------
10
11module Numeric.LinearAlgebra.GSL (
12 RandDist(..), randomVector,
13 saveMatrix,
14 fwriteVector, freadVector, fprintfVector, fscanfVector,
15 fileDimensions, loadMatrix, fromFile
16) where
17
18import Data.Packed
19import Numeric.GSL.Internal hiding (TV,TM,TCV,TCM)
20
21import Data.Complex
22import Foreign.Marshal.Alloc(free)
23import Foreign.Ptr(Ptr)
24import Foreign.C.Types
25import Foreign.C.String(newCString)
26import System.IO.Unsafe(unsafePerformIO)
27import System.Process(readProcess)
28
29fromei x = fromIntegral (fromEnum x) :: CInt
30
31-----------------------------------------------------------------------
32
33data RandDist = Uniform -- ^ uniform distribution in [0,1)
34 | Gaussian -- ^ normal distribution with mean zero and standard deviation one
35 deriving Enum
36
37-- | Obtains a vector of pseudorandom elements from the the mt19937 generator in GSL, with a given seed. Use randomIO to get a random seed.
38randomVector :: Int -- ^ seed
39 -> RandDist -- ^ distribution
40 -> Int -- ^ vector size
41 -> Vector Double
42randomVector seed dist n = unsafePerformIO $ do
43 r <- createVector n
44 app1 (c_random_vector (fi seed) ((fi.fromEnum) dist)) vec r "randomVector"
45 return r
46
47foreign import ccall unsafe "random_vector" c_random_vector :: CInt -> CInt -> TV
48
49--------------------------------------------------------------------------------
50
51-- | Saves a matrix as 2D ASCII table.
52saveMatrix :: FilePath
53 -> String -- ^ format (%f, %g, %e)
54 -> Matrix Double
55 -> IO ()
56saveMatrix filename fmt m = do
57 charname <- newCString filename
58 charfmt <- newCString fmt
59 let o = if orderOf m == RowMajor then 1 else 0
60 app1 (matrix_fprintf charname charfmt o) mat m "matrix_fprintf"
61 free charname
62 free charfmt
63
64foreign import ccall unsafe "matrix_fprintf" matrix_fprintf :: Ptr CChar -> Ptr CChar -> CInt -> TM
65
66--------------------------------------------------------------------------------
67
68-- | Loads a vector from an ASCII file (the number of elements must be known in advance).
69fscanfVector :: FilePath -> Int -> IO (Vector Double)
70fscanfVector filename n = do
71 charname <- newCString filename
72 res <- createVector n
73 app1 (gsl_vector_fscanf charname) vec res "gsl_vector_fscanf"
74 free charname
75 return res
76
77foreign import ccall unsafe "vector_fscanf" gsl_vector_fscanf:: Ptr CChar -> TV
78
79-- | Saves the elements of a vector, with a given format (%f, %e, %g), to an ASCII file.
80fprintfVector :: FilePath -> String -> Vector Double -> IO ()
81fprintfVector filename fmt v = do
82 charname <- newCString filename
83 charfmt <- newCString fmt
84 app1 (gsl_vector_fprintf charname charfmt) vec v "gsl_vector_fprintf"
85 free charname
86 free charfmt
87
88foreign import ccall unsafe "vector_fprintf" gsl_vector_fprintf :: Ptr CChar -> Ptr CChar -> TV
89
90-- | Loads a vector from a binary file (the number of elements must be known in advance).
91freadVector :: FilePath -> Int -> IO (Vector Double)
92freadVector filename n = do
93 charname <- newCString filename
94 res <- createVector n
95 app1 (gsl_vector_fread charname) vec res "gsl_vector_fread"
96 free charname
97 return res
98
99foreign import ccall unsafe "vector_fread" gsl_vector_fread:: Ptr CChar -> TV
100
101-- | Saves the elements of a vector to a binary file.
102fwriteVector :: FilePath -> Vector Double -> IO ()
103fwriteVector filename v = do
104 charname <- newCString filename
105 app1 (gsl_vector_fwrite charname) vec v "gsl_vector_fwrite"
106 free charname
107
108foreign import ccall unsafe "vector_fwrite" gsl_vector_fwrite :: Ptr CChar -> TV
109
110type PD = Ptr Double --
111type TV = CInt -> PD -> IO CInt --
112type TM = CInt -> CInt -> PD -> IO CInt --
113
114--------------------------------------------------------------------------------
115
116{- | obtains the number of rows and columns in an ASCII data file
117 (provisionally using unix's wc).
118-}
119fileDimensions :: FilePath -> IO (Int,Int)
120fileDimensions fname = do
121 wcres <- readProcess "wc" ["-w",fname] ""
122 contents <- readFile fname
123 let tot = read . head . words $ wcres
124 c = length . head . dropWhile null . map words . lines $ contents
125 if tot > 0
126 then return (tot `div` c, c)
127 else return (0,0)
128
129-- | Loads a matrix from an ASCII file formatted as a 2D table.
130loadMatrix :: FilePath -> IO (Matrix Double)
131loadMatrix file = fromFile file =<< fileDimensions file
132
133-- | Loads a matrix from an ASCII file (the number of rows and columns must be known in advance).
134fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double)
135fromFile filename (r,c) = reshape c `fmap` fscanfVector filename (r*c)
136
diff --git a/packages/hmatrix/src/Numeric/LinearAlgebra/IO.hs b/packages/hmatrix/src/Numeric/LinearAlgebra/IO.hs
new file mode 100644
index 0000000..d2278ee
--- /dev/null
+++ b/packages/hmatrix/src/Numeric/LinearAlgebra/IO.hs
@@ -0,0 +1,42 @@
1-----------------------------------------------------------------------------
2-- |
3-- Module : Numeric.LinearAlgebra.IO
4-- Copyright : (c) Alberto Ruiz 2007-14
5-- License : GPL
6-- Maintainer : Alberto Ruiz
7-- Stability : provisional
8--
9-----------------------------------------------------------------------------
10
11module Numeric.LinearAlgebra.IO (
12 saveMatrix,
13 fwriteVector, freadVector, fprintfVector, fscanfVector,
14 fileDimensions, loadMatrix, fromFile
15) where
16
17import Data.Packed
18import Numeric.GSL.LinearAlgebra
19import System.Process(readProcess)
20
21
22{- | obtains the number of rows and columns in an ASCII data file
23 (provisionally using unix's wc).
24-}
25fileDimensions :: FilePath -> IO (Int,Int)
26fileDimensions fname = do
27 wcres <- readProcess "wc" ["-w",fname] ""
28 contents <- readFile fname
29 let tot = read . head . words $ wcres
30 c = length . head . dropWhile null . map words . lines $ contents
31 if tot > 0
32 then return (tot `div` c, c)
33 else return (0,0)
34
35-- | Loads a matrix from an ASCII file formatted as a 2D table.
36loadMatrix :: FilePath -> IO (Matrix Double)
37loadMatrix file = fromFile file =<< fileDimensions file
38
39-- | Loads a matrix from an ASCII file (the number of rows and columns must be known in advance).
40fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double)
41fromFile filename (r,c) = reshape c `fmap` fscanfVector filename (r*c)
42
diff --git a/packages/hmatrix/src/Numeric/LinearAlgebra/Random.hs b/packages/hmatrix/src/Numeric/LinearAlgebra/Random.hs
new file mode 100644
index 0000000..e9ab2b7
--- /dev/null
+++ b/packages/hmatrix/src/Numeric/LinearAlgebra/Random.hs
@@ -0,0 +1,84 @@
1-----------------------------------------------------------------------------
2-- |
3-- Module : Numeric.LinearAlgebra.Random
4-- Copyright : (c) Alberto Ruiz 2009-14
5-- License : GPL
6--
7-- Maintainer : Alberto Ruiz
8-- Stability : provisional
9--
10-- Random vectors and matrices.
11--
12-----------------------------------------------------------------------------
13
14module Numeric.LinearAlgebra.Random (
15 Seed,
16 RandDist(..),
17 randomVector,
18 gaussianSample,
19 uniformSample,
20 rand, randn
21) where
22
23import Numeric.GSL.LinearAlgebra
24import Numeric.Container
25import Numeric.LinearAlgebra.Algorithms
26import System.Random(randomIO)
27
28
29type Seed = Int
30
31-- | Obtains a matrix whose rows are pseudorandom samples from a multivariate
32-- Gaussian distribution.
33gaussianSample :: Seed
34 -> Int -- ^ number of rows
35 -> Vector Double -- ^ mean vector
36 -> Matrix Double -- ^ covariance matrix
37 -> Matrix Double -- ^ result
38gaussianSample seed n med cov = m where
39 c = dim med
40 meds = konst' 1 n `outer` med
41 rs = reshape c $ randomVector seed Gaussian (c * n)
42 m = rs `mXm` cholSH cov `add` meds
43
44-- | Obtains a matrix whose rows are pseudorandom samples from a multivariate
45-- uniform distribution.
46uniformSample :: Seed
47 -> Int -- ^ number of rows
48 -> [(Double,Double)] -- ^ ranges for each column
49 -> Matrix Double -- ^ result
50uniformSample seed n rgs = m where
51 (as,bs) = unzip rgs
52 a = fromList as
53 cs = zipWith subtract as bs
54 d = dim a
55 dat = toRows $ reshape n $ randomVector seed Uniform (n*d)
56 am = konst' 1 n `outer` a
57 m = fromColumns (zipWith scale cs dat) `add` am
58
59-- | pseudorandom matrix with uniform elements between 0 and 1
60randm :: RandDist
61 -> Int -- ^ rows
62 -> Int -- ^ columns
63 -> IO (Matrix Double)
64randm d r c = do
65 seed <- randomIO
66 return (reshape c $ randomVector seed d (r*c))
67
68-- | pseudorandom matrix with uniform elements between 0 and 1
69rand :: Int -> Int -> IO (Matrix Double)
70rand = randm Uniform
71
72{- | pseudorandom matrix with normal elements
73
74>>> x <- randn 3 5
75>>> disp 3 x
763x5
770.386 -1.141 0.491 -0.510 1.512
780.069 -0.919 1.022 -0.181 0.745
790.313 -0.670 -0.097 -1.575 -0.583
80
81-}
82randn :: Int -> Int -> IO (Matrix Double)
83randn = randm Gaussian
84