summaryrefslogtreecommitdiff
path: root/lib/Data
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2007-10-31 13:36:37 +0000
committerAlberto Ruiz <aruiz@um.es>2007-10-31 13:36:37 +0000
commitdb223fb5f9cd4adef54736812f796b48ecc289e6 (patch)
treef787f8d7c929f2b978bb8fd6aa83aa1b5db05339 /lib/Data
parentbf838323545fe0878382f8f4d41b0f36714afa43 (diff)
Field->Element, GenMat->Field
Diffstat (limited to 'lib/Data')
-rw-r--r--lib/Data/Packed.hs2
-rw-r--r--lib/Data/Packed/Internal/Matrix.hs36
-rw-r--r--lib/Data/Packed/Matrix.hs44
3 files changed, 41 insertions, 41 deletions
diff --git a/lib/Data/Packed.hs b/lib/Data/Packed.hs
index 668d2f7..53aced9 100644
--- a/lib/Data/Packed.hs
+++ b/lib/Data/Packed.hs
@@ -27,7 +27,7 @@ import Data.Complex
27import Data.Packed.Internal 27import Data.Packed.Internal
28 28
29-- | conversion utilities 29-- | conversion utilities
30class (Field e) => Container c e where 30class (Element e) => Container c e where
31 toComplex :: RealFloat e => (c e, c e) -> c (Complex e) 31 toComplex :: RealFloat e => (c e, c e) -> c (Complex e)
32 fromComplex :: RealFloat e => c (Complex e) -> (c e, c e) 32 fromComplex :: RealFloat e => c (Complex e) -> (c e, c e)
33 comp :: RealFloat e => c e -> c (Complex e) 33 comp :: RealFloat e => c e -> c (Complex e)
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs
index f63ee52..fbab33c 100644
--- a/lib/Data/Packed/Internal/Matrix.hs
+++ b/lib/Data/Packed/Internal/Matrix.hs
@@ -84,17 +84,17 @@ type Mt t s = Int -> Int -> Ptr t -> s
84-- type t ::> s = Mt t s 84-- type t ::> s = Mt t s
85 85
86-- | the inverse of 'Data.Packed.Matrix.fromLists' 86-- | the inverse of 'Data.Packed.Matrix.fromLists'
87toLists :: (Field t) => Matrix t -> [[t]] 87toLists :: (Element t) => Matrix t -> [[t]]
88toLists m = partit (cols m) . toList . cdat $ m 88toLists m = partit (cols m) . toList . cdat $ m
89 89
90-- | creates a Matrix from a list of vectors 90-- | creates a Matrix from a list of vectors
91fromRows :: Field t => [Vector t] -> Matrix t 91fromRows :: Element t => [Vector t] -> Matrix t
92fromRows vs = case common dim vs of 92fromRows vs = case common dim vs of
93 Nothing -> error "fromRows applied to [] or to vectors with different sizes" 93 Nothing -> error "fromRows applied to [] or to vectors with different sizes"
94 Just c -> reshape c (join vs) 94 Just c -> reshape c (join vs)
95 95
96-- | extracts the rows of a matrix as a list of vectors 96-- | extracts the rows of a matrix as a list of vectors
97toRows :: Field t => Matrix t -> [Vector t] 97toRows :: Element t => Matrix t -> [Vector t]
98toRows m = toRows' 0 where 98toRows m = toRows' 0 where
99 v = cdat m 99 v = cdat m
100 r = rows m 100 r = rows m
@@ -103,11 +103,11 @@ toRows m = toRows' 0 where
103 | otherwise = subVector k c v : toRows' (k+c) 103 | otherwise = subVector k c v : toRows' (k+c)
104 104
105-- | Creates a matrix from a list of vectors, as columns 105-- | Creates a matrix from a list of vectors, as columns
106fromColumns :: Field t => [Vector t] -> Matrix t 106fromColumns :: Element t => [Vector t] -> Matrix t
107fromColumns m = trans . fromRows $ m 107fromColumns m = trans . fromRows $ m
108 108
109-- | Creates a list of vectors from the columns of a matrix 109-- | Creates a list of vectors from the columns of a matrix
110toColumns :: Field t => Matrix t -> [Vector t] 110toColumns :: Element t => Matrix t -> [Vector t]
111toColumns m = toRows . trans $ m 111toColumns m = toRows . trans $ m
112 112
113 113
@@ -152,18 +152,18 @@ where r is the desired number of rows.)
152 , 9.0, 10.0, 11.0, 12.0 ]@ 152 , 9.0, 10.0, 11.0, 12.0 ]@
153 153
154-} 154-}
155reshape :: Field t => Int -> Vector t -> Matrix t 155reshape :: Element t => Int -> Vector t -> Matrix t
156reshape c v = matrixFromVector RowMajor c v 156reshape c v = matrixFromVector RowMajor c v
157 157
158singleton x = reshape 1 (fromList [x]) 158singleton x = reshape 1 (fromList [x])
159 159
160-- | application of a vector function on the flattened matrix elements 160-- | application of a vector function on the flattened matrix elements
161liftMatrix :: (Field a, Field b) => (Vector a -> Vector b) -> Matrix a -> Matrix b 161liftMatrix :: (Element a, Element b) => (Vector a -> Vector b) -> Matrix a -> Matrix b
162liftMatrix f MC { cols = c, cdat = d } = matrixFromVector RowMajor c (f d) 162liftMatrix f MC { cols = c, cdat = d } = matrixFromVector RowMajor c (f d)
163liftMatrix f MF { cols = c, fdat = d } = matrixFromVector ColumnMajor c (f d) 163liftMatrix f MF { cols = c, fdat = d } = matrixFromVector ColumnMajor c (f d)
164 164
165-- | application of a vector function on the flattened matrices elements 165-- | application of a vector function on the flattened matrices elements
166liftMatrix2 :: (Field t, Field a, Field b) => (Vector a -> Vector b -> Vector t) -> Matrix a -> Matrix b -> Matrix t 166liftMatrix2 :: (Element t, Element a, Element b) => (Vector a -> Vector b -> Vector t) -> Matrix a -> Matrix b -> Matrix t
167liftMatrix2 f m1 m2 167liftMatrix2 f m1 m2
168 | not (compat m1 m2) = error "nonconformant matrices in liftMatrix2" 168 | not (compat m1 m2) = error "nonconformant matrices in liftMatrix2"
169 | otherwise = case m1 of 169 | otherwise = case m1 of
@@ -176,8 +176,8 @@ compat m1 m2 = rows m1 == rows m2 && cols m1 == cols m2
176 176
177---------------------------------------------------------------- 177----------------------------------------------------------------
178 178
179-- | Optimized matrix computations are provided for elements in the Field class. 179-- | Optimized matrix computations are provided for elements in the Element class.
180class (Storable a, Floating a) => Field a where 180class (Storable a, Floating a) => Element a where
181 constantD :: a -> Int -> Vector a 181 constantD :: a -> Int -> Vector a
182 transdata :: Int -> Vector a -> Int -> Vector a 182 transdata :: Int -> Vector a -> Int -> Vector a
183 multiplyD :: Matrix a -> Matrix a -> Matrix a 183 multiplyD :: Matrix a -> Matrix a -> Matrix a
@@ -186,14 +186,14 @@ class (Storable a, Floating a) => Field a where
186 -> Matrix a -> Matrix a 186 -> Matrix a -> Matrix a
187 diagD :: Vector a -> Matrix a 187 diagD :: Vector a -> Matrix a
188 188
189instance Field Double where 189instance Element Double where
190 constantD = constantR 190 constantD = constantR
191 transdata = transdataR 191 transdata = transdataR
192 multiplyD = multiplyR 192 multiplyD = multiplyR
193 subMatrixD = subMatrixR 193 subMatrixD = subMatrixR
194 diagD = diagR 194 diagD = diagR
195 195
196instance Field (Complex Double) where 196instance Element (Complex Double) where
197 constantD = constantC 197 constantD = constantC
198 transdata = transdataC 198 transdata = transdataC
199 multiplyD = multiplyC 199 multiplyD = multiplyC
@@ -202,7 +202,7 @@ instance Field (Complex Double) where
202 202
203------------------------------------------------------------------ 203------------------------------------------------------------------
204 204
205(>|<) :: (Field a) => Int -> Int -> [a] -> Matrix a 205(>|<) :: (Element a) => Int -> Int -> [a] -> Matrix a
206r >|< c = f where 206r >|< c = f where
207 f l | dim v == r*c = matrixFromVector ColumnMajor c v 207 f l | dim v == r*c = matrixFromVector ColumnMajor c v
208 | otherwise = error $ "inconsistent list size = " 208 | otherwise = error $ "inconsistent list size = "
@@ -260,13 +260,13 @@ foreign import ccall safe "auxi.h multiplyC"
260 -> Int -> Int -> Ptr (Complex Double) 260 -> Int -> Int -> Ptr (Complex Double)
261 -> IO Int 261 -> IO Int
262 262
263multiply' :: (Field a) => MatrixOrder -> Matrix a -> Matrix a -> Matrix a 263multiply' :: (Element a) => MatrixOrder -> Matrix a -> Matrix a -> Matrix a
264multiply' RowMajor a b = multiplyD a b 264multiply' RowMajor a b = multiplyD a b
265multiply' ColumnMajor a b = trans $ multiplyD (trans b) (trans a) 265multiply' ColumnMajor a b = trans $ multiplyD (trans b) (trans a)
266 266
267 267
268-- | matrix product 268-- | matrix product
269multiply :: (Field a) => Matrix a -> Matrix a -> Matrix a 269multiply :: (Element a) => Matrix a -> Matrix a -> Matrix a
270multiply = multiplyD 270multiply = multiplyD
271 271
272---------------------------------------------------------------------- 272----------------------------------------------------------------------
@@ -287,7 +287,7 @@ subMatrixC (r0,c0) (rt,ct) x =
287 reshape (2*cols x) . asReal . cdat $ x 287 reshape (2*cols x) . asReal . cdat $ x
288 288
289-- | Extracts a submatrix from a matrix. 289-- | Extracts a submatrix from a matrix.
290subMatrix :: Field a 290subMatrix :: Element a
291 => (Int,Int) -- ^ (r0,c0) starting position 291 => (Int,Int) -- ^ (r0,c0) starting position
292 -> (Int,Int) -- ^ (rt,ct) dimensions of submatrix 292 -> (Int,Int) -- ^ (rt,ct) dimensions of submatrix
293 -> Matrix a -- ^ input matrix 293 -> Matrix a -- ^ input matrix
@@ -313,7 +313,7 @@ diagC = diagAux c_diagC "diagC"
313foreign import ccall "auxi.h diagC" c_diagC :: TCVCM 313foreign import ccall "auxi.h diagC" c_diagC :: TCVCM
314 314
315-- | creates a square matrix with the given diagonal 315-- | creates a square matrix with the given diagonal
316diag :: Field a => Vector a -> Matrix a 316diag :: Element a => Vector a -> Matrix a
317diag = diagD 317diag = diagD
318 318
319------------------------------------------------------------------------ 319------------------------------------------------------------------------
@@ -340,7 +340,7 @@ foreign import ccall safe "auxi.h constantC"
340@> constant 2 7 340@> constant 2 7
3417 |> [2.0,2.0,2.0,2.0,2.0,2.0,2.0]@ 3417 |> [2.0,2.0,2.0,2.0,2.0,2.0,2.0]@
342-} 342-}
343constant :: Field a => a -> Int -> Vector a 343constant :: Element a => a -> Int -> Vector a
344constant = constantD 344constant = constantD
345 345
346-------------------------------------------------------------------------- 346--------------------------------------------------------------------------
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs
index a705975..e96500f 100644
--- a/lib/Data/Packed/Matrix.hs
+++ b/lib/Data/Packed/Matrix.hs
@@ -14,7 +14,7 @@
14----------------------------------------------------------------------------- 14-----------------------------------------------------------------------------
15 15
16module Data.Packed.Matrix ( 16module Data.Packed.Matrix (
17 Field, 17 Element,
18 Matrix,rows,cols, 18 Matrix,rows,cols,
19 (><), 19 (><),
20 trans, 20 trans,
@@ -41,13 +41,13 @@ import Data.List(transpose,intersperse)
41import Data.Array 41import Data.Array
42 42
43-- | creates a matrix from a vertical list of matrices 43-- | creates a matrix from a vertical list of matrices
44joinVert :: Field t => [Matrix t] -> Matrix t 44joinVert :: Element t => [Matrix t] -> Matrix t
45joinVert ms = case common cols ms of 45joinVert ms = case common cols ms of
46 Nothing -> error "joinVert on matrices with different number of columns" 46 Nothing -> error "joinVert on matrices with different number of columns"
47 Just c -> reshape c $ join (map cdat ms) 47 Just c -> reshape c $ join (map cdat ms)
48 48
49-- | creates a matrix from a horizontal list of matrices 49-- | creates a matrix from a horizontal list of matrices
50joinHoriz :: Field t => [Matrix t] -> Matrix t 50joinHoriz :: Element t => [Matrix t] -> Matrix t
51joinHoriz ms = trans. joinVert . map trans $ ms 51joinHoriz ms = trans. joinVert . map trans $ ms
52 52
53{- | Creates a matrix from blocks given as a list of lists of matrices: 53{- | Creates a matrix from blocks given as a list of lists of matrices:
@@ -63,15 +63,15 @@ joinHoriz ms = trans. joinVert . map trans $ ms
63 , -1.0, -1.0, -1.0, -1.0, 0.0, 7.0, 0.0 63 , -1.0, -1.0, -1.0, -1.0, 0.0, 7.0, 0.0
64 , -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 2.0 ]@ 64 , -1.0, -1.0, -1.0, -1.0, 0.0, 0.0, 2.0 ]@
65-} 65-}
66fromBlocks :: Field t => [[Matrix t]] -> Matrix t 66fromBlocks :: Element t => [[Matrix t]] -> Matrix t
67fromBlocks = joinVert . map joinHoriz 67fromBlocks = joinVert . map joinHoriz
68 68
69-- | Reverse rows 69-- | Reverse rows
70flipud :: Field t => Matrix t -> Matrix t 70flipud :: Element t => Matrix t -> Matrix t
71flipud m = fromRows . reverse . toRows $ m 71flipud m = fromRows . reverse . toRows $ m
72 72
73-- | Reverse columns 73-- | Reverse columns
74fliprl :: Field t => Matrix t -> Matrix t 74fliprl :: Element t => Matrix t -> Matrix t
75fliprl m = fromColumns . reverse . toColumns $ m 75fliprl m = fromColumns . reverse . toColumns $ m
76 76
77------------------------------------------------------------ 77------------------------------------------------------------
@@ -84,7 +84,7 @@ fliprl m = fromColumns . reverse . toColumns $ m
84 , 0.0, 5.0, 0.0, 0.0 84 , 0.0, 5.0, 0.0, 0.0
85 , 0.0, 0.0, 5.0, 0.0 ]@ 85 , 0.0, 0.0, 5.0, 0.0 ]@
86-} 86-}
87diagRect :: (Field t, Num t) => Vector t -> Int -> Int -> Matrix t 87diagRect :: (Element t, Num t) => Vector t -> Int -> Int -> Matrix t
88diagRect s r c 88diagRect s r c
89 | dim s < min r c = error "diagRect" 89 | dim s < min r c = error "diagRect"
90 | r == c = diag s 90 | r == c = diag s
@@ -93,11 +93,11 @@ diagRect s r c
93 where zeros (r,c) = reshape c $ constantD 0 (r*c) 93 where zeros (r,c) = reshape c $ constantD 0 (r*c)
94 94
95-- | extracts the diagonal from a rectangular matrix 95-- | extracts the diagonal from a rectangular matrix
96takeDiag :: (Field t) => Matrix t -> Vector t 96takeDiag :: (Element t) => Matrix t -> Vector t
97takeDiag m = fromList [cdat m `at` (k*cols m+k) | k <- [0 .. min (rows m) (cols m) -1]] 97takeDiag m = fromList [cdat m `at` (k*cols m+k) | k <- [0 .. min (rows m) (cols m) -1]]
98 98
99-- | creates the identity matrix of given dimension 99-- | creates the identity matrix of given dimension
100ident :: Field a => Int -> Matrix a 100ident :: Element a => Int -> Matrix a
101ident n = diag (constant 1 n) 101ident n = diag (constant 1 n)
102 102
103------------------------------------------------------------ 103------------------------------------------------------------
@@ -112,7 +112,7 @@ ident n = diag (constant 1 n)
112This is the format produced by the instances of Show (Matrix a), which 112This is the format produced by the instances of Show (Matrix a), which
113can also be used for input. 113can also be used for input.
114-} 114-}
115(><) :: (Field a) => Int -> Int -> [a] -> Matrix a 115(><) :: (Element a) => Int -> Int -> [a] -> Matrix a
116r >< c = f where 116r >< c = f where
117 f l | dim v == r*c = matrixFromVector RowMajor c v 117 f l | dim v == r*c = matrixFromVector RowMajor c v
118 | otherwise = error $ "inconsistent list size = " 118 | otherwise = error $ "inconsistent list size = "
@@ -122,16 +122,16 @@ r >< c = f where
122---------------------------------------------------------------- 122----------------------------------------------------------------
123 123
124-- | Creates a matrix with the first n rows of another matrix 124-- | Creates a matrix with the first n rows of another matrix
125takeRows :: Field t => Int -> Matrix t -> Matrix t 125takeRows :: Element t => Int -> Matrix t -> Matrix t
126takeRows n mat = subMatrix (0,0) (n, cols mat) mat 126takeRows n mat = subMatrix (0,0) (n, cols mat) mat
127-- | Creates a copy of a matrix without the first n rows 127-- | Creates a copy of a matrix without the first n rows
128dropRows :: Field t => Int -> Matrix t -> Matrix t 128dropRows :: Element t => Int -> Matrix t -> Matrix t
129dropRows n mat = subMatrix (n,0) (rows mat - n, cols mat) mat 129dropRows n mat = subMatrix (n,0) (rows mat - n, cols mat) mat
130-- |Creates a matrix with the first n columns of another matrix 130-- |Creates a matrix with the first n columns of another matrix
131takeColumns :: Field t => Int -> Matrix t -> Matrix t 131takeColumns :: Element t => Int -> Matrix t -> Matrix t
132takeColumns n mat = subMatrix (0,0) (rows mat, n) mat 132takeColumns n mat = subMatrix (0,0) (rows mat, n) mat
133-- | Creates a copy of a matrix without the first n columns 133-- | Creates a copy of a matrix without the first n columns
134dropColumns :: Field t => Int -> Matrix t -> Matrix t 134dropColumns :: Element t => Int -> Matrix t -> Matrix t
135dropColumns n mat = subMatrix (0,n) (rows mat, cols mat - n) mat 135dropColumns n mat = subMatrix (0,n) (rows mat, cols mat - n) mat
136 136
137---------------------------------------------------------------- 137----------------------------------------------------------------
@@ -141,7 +141,7 @@ dropColumns n mat = subMatrix (0,n) (rows mat, cols mat - n) mat
141@\> flatten ('ident' 3) 141@\> flatten ('ident' 3)
1429 |> [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]@ 1429 |> [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]@
143-} 143-}
144flatten :: Field t => Matrix t -> Vector t 144flatten :: Element t => Matrix t -> Vector t
145flatten = cdat 145flatten = cdat
146 146
147{- | Creates a 'Matrix' from a list of lists (considered as rows). 147{- | Creates a 'Matrix' from a list of lists (considered as rows).
@@ -152,20 +152,20 @@ flatten = cdat
152 , 3.0, 4.0 152 , 3.0, 4.0
153 , 5.0, 6.0 ]@ 153 , 5.0, 6.0 ]@
154-} 154-}
155fromLists :: Field t => [[t]] -> Matrix t 155fromLists :: Element t => [[t]] -> Matrix t
156fromLists = fromRows . map fromList 156fromLists = fromRows . map fromList
157 157
158-- | creates a 1-row matrix from a vector 158-- | creates a 1-row matrix from a vector
159asRow :: Field a => Vector a -> Matrix a 159asRow :: Element a => Vector a -> Matrix a
160asRow v = reshape (dim v) v 160asRow v = reshape (dim v) v
161 161
162-- | creates a 1-column matrix from a vector 162-- | creates a 1-column matrix from a vector
163asColumn :: Field a => Vector a -> Matrix a 163asColumn :: Element a => Vector a -> Matrix a
164asColumn v = reshape 1 v 164asColumn v = reshape 1 v
165 165
166----------------------------------------------------- 166-----------------------------------------------------
167 167
168fromArray2D :: (Field e) => Array (Int, Int) e -> Matrix e 168fromArray2D :: (Element e) => Array (Int, Int) e -> Matrix e
169fromArray2D m = (r><c) (elems m) 169fromArray2D m = (r><c) (elems m)
170 where ((r0,c0),(r1,c1)) = bounds m 170 where ((r0,c0),(r1,c1)) = bounds m
171 r = r1-r0+1 171 r = r1-r0+1
@@ -201,7 +201,7 @@ this function the user can easily define any desired display function:
201@disp = putStrLn . format \" \" (printf \"%.2f\")@ 201@disp = putStrLn . format \" \" (printf \"%.2f\")@
202 202
203-} 203-}
204format :: (Field t) => String -> (t -> String) -> Matrix t -> String 204format :: (Element t) => String -> (t -> String) -> Matrix t -> String
205format sep f m = dsp' sep . map (map f) . toLists $ m 205format sep f m = dsp' sep . map (map f) . toLists $ m
206 206
207disp m f = putStrLn $ "matrix ("++show (rows m) ++"x"++ show (cols m) ++")\n"++format " | " f m 207disp m f = putStrLn $ "matrix ("++show (rows m) ++"x"++ show (cols m) ++")\n"++format " | " f m
@@ -217,7 +217,7 @@ readMatrix :: String -> Matrix Double
217readMatrix = fromLists . map (map read). map words . filter (not.null) . lines 217readMatrix = fromLists . map (map read). map words . filter (not.null) . lines
218 218
219-- | rearranges the rows of a matrix according to the order given in a list of integers. 219-- | rearranges the rows of a matrix according to the order given in a list of integers.
220extractRows :: Field t => [Int] -> Matrix t -> Matrix t 220extractRows :: Element t => [Int] -> Matrix t -> Matrix t
221extractRows l m = fromRows $ extract (toRows $ m) l 221extractRows l m = fromRows $ extract (toRows $ m) l
222 where extract l is = [l!!i |i<-is] 222 where extract l is = [l!!i |i<-is]
223 223
@@ -231,5 +231,5 @@ extractRows l m = fromRows $ extract (toRows $ m) l
231 , 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 ]@ 231 , 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 ]@
232 232
233-} 233-}
234repmat :: (Field t) => Matrix t -> Int -> Int -> Matrix t 234repmat :: (Element t) => Matrix t -> Int -> Int -> Matrix t
235repmat m r c = fromBlocks $ partit c $ replicate (r*c) m \ No newline at end of file 235repmat m r c = fromBlocks $ partit c $ replicate (r*c) m \ No newline at end of file