summaryrefslogtreecommitdiff
path: root/packages/gsl/src/Numeric/GSL/Vector.hs
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gsl/src/Numeric/GSL/Vector.hs')
-rw-r--r--packages/gsl/src/Numeric/GSL/Vector.hs107
1 files changed, 107 insertions, 0 deletions
diff --git a/packages/gsl/src/Numeric/GSL/Vector.hs b/packages/gsl/src/Numeric/GSL/Vector.hs
new file mode 100644
index 0000000..af79f32
--- /dev/null
+++ b/packages/gsl/src/Numeric/GSL/Vector.hs
@@ -0,0 +1,107 @@
1-----------------------------------------------------------------------------
2-- |
3-- Module : Numeric.GSL.Vector
4-- Copyright : (c) Alberto Ruiz 2007-14
5-- License : GPL
6-- Maintainer : Alberto Ruiz
7-- Stability : provisional
8--
9-----------------------------------------------------------------------------
10
11module Numeric.GSL.Vector (
12 randomVector,
13 saveMatrix,
14 fwriteVector, freadVector, fprintfVector, fscanfVector
15) where
16
17import Data.Packed
18import Numeric.LinearAlgebra(RandDist(..))
19import Numeric.GSL.Internal hiding (TV,TM,TCV,TCM)
20
21import Foreign.Marshal.Alloc(free)
22import Foreign.Ptr(Ptr)
23import Foreign.C.Types
24import Foreign.C.String(newCString)
25import System.IO.Unsafe(unsafePerformIO)
26
27fromei x = fromIntegral (fromEnum x) :: CInt
28
29-----------------------------------------------------------------------
30
31-- | Obtains a vector of pseudorandom elements from the the mt19937 generator in GSL, with a given seed. Use randomIO to get a random seed.
32randomVector :: Int -- ^ seed
33 -> RandDist -- ^ distribution
34 -> Int -- ^ vector size
35 -> Vector Double
36randomVector seed dist n = unsafePerformIO $ do
37 r <- createVector n
38 app1 (c_random_vector_GSL (fi seed) ((fi.fromEnum) dist)) vec r "randomVectorGSL"
39 return r
40
41foreign import ccall unsafe "random_vector_GSL" c_random_vector_GSL :: CInt -> CInt -> TV
42
43--------------------------------------------------------------------------------
44
45-- | Saves a matrix as 2D ASCII table.
46saveMatrix :: FilePath
47 -> String -- ^ format (%f, %g, %e)
48 -> Matrix Double
49 -> IO ()
50saveMatrix filename fmt m = do
51 charname <- newCString filename
52 charfmt <- newCString fmt
53 let o = if orderOf m == RowMajor then 1 else 0
54 app1 (matrix_fprintf charname charfmt o) mat m "matrix_fprintf"
55 free charname
56 free charfmt
57
58foreign import ccall unsafe "matrix_fprintf" matrix_fprintf :: Ptr CChar -> Ptr CChar -> CInt -> TM
59
60--------------------------------------------------------------------------------
61
62-- | Loads a vector from an ASCII file (the number of elements must be known in advance).
63fscanfVector :: FilePath -> Int -> IO (Vector Double)
64fscanfVector filename n = do
65 charname <- newCString filename
66 res <- createVector n
67 app1 (gsl_vector_fscanf charname) vec res "gsl_vector_fscanf"
68 free charname
69 return res
70
71foreign import ccall unsafe "vector_fscanf" gsl_vector_fscanf:: Ptr CChar -> TV
72
73-- | Saves the elements of a vector, with a given format (%f, %e, %g), to an ASCII file.
74fprintfVector :: FilePath -> String -> Vector Double -> IO ()
75fprintfVector filename fmt v = do
76 charname <- newCString filename
77 charfmt <- newCString fmt
78 app1 (gsl_vector_fprintf charname charfmt) vec v "gsl_vector_fprintf"
79 free charname
80 free charfmt
81
82foreign import ccall unsafe "vector_fprintf" gsl_vector_fprintf :: Ptr CChar -> Ptr CChar -> TV
83
84-- | Loads a vector from a binary file (the number of elements must be known in advance).
85freadVector :: FilePath -> Int -> IO (Vector Double)
86freadVector filename n = do
87 charname <- newCString filename
88 res <- createVector n
89 app1 (gsl_vector_fread charname) vec res "gsl_vector_fread"
90 free charname
91 return res
92
93foreign import ccall unsafe "vector_fread" gsl_vector_fread:: Ptr CChar -> TV
94
95-- | Saves the elements of a vector to a binary file.
96fwriteVector :: FilePath -> Vector Double -> IO ()
97fwriteVector filename v = do
98 charname <- newCString filename
99 app1 (gsl_vector_fwrite charname) vec v "gsl_vector_fwrite"
100 free charname
101
102foreign import ccall unsafe "vector_fwrite" gsl_vector_fwrite :: Ptr CChar -> TV
103
104type PD = Ptr Double --
105type TV = CInt -> PD -> IO CInt --
106type TM = CInt -> CInt -> PD -> IO CInt --
107