diff options
Diffstat (limited to 'lib/Data/Packed')
-rw-r--r-- | lib/Data/Packed/Internal/Matrix.hs | 20 | ||||
-rw-r--r-- | lib/Data/Packed/Matrix.hs | 10 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs index 01d2ccf..68547bd 100644 --- a/lib/Data/Packed/Internal/Matrix.hs +++ b/lib/Data/Packed/Internal/Matrix.hs | |||
@@ -23,6 +23,7 @@ import Data.Packed.Internal.Vector | |||
23 | import Foreign hiding (xor) | 23 | import Foreign hiding (xor) |
24 | import Complex | 24 | import Complex |
25 | import Foreign.C.Types | 25 | import Foreign.C.Types |
26 | import Foreign.C.String | ||
26 | 27 | ||
27 | ----------------------------------------------------------------- | 28 | ----------------------------------------------------------------- |
28 | 29 | ||
@@ -350,6 +351,19 @@ fromComplex :: Vector (Complex Double) -> (Vector Double, Vector Double) | |||
350 | fromComplex z = (r,i) where | 351 | fromComplex z = (r,i) where |
351 | [r,i] = toColumns $ reshape 2 $ asReal z | 352 | [r,i] = toColumns $ reshape 2 $ asReal z |
352 | 353 | ||
353 | -- | loads a matrix from an ASCII file (the number of rows and columns must be known in advance). | 354 | -------------------------------------------------------------------------- |
354 | fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double) | 355 | |
355 | fromFile filename (r,c) = reshape c `fmap` fscanfVector filename (r*c) | 356 | -- | Saves a matrix as 2D ASCII table. |
357 | saveMatrix :: FilePath | ||
358 | -> String -- ^ format (%f, %g, %e) | ||
359 | -> Matrix Double | ||
360 | -> IO () | ||
361 | saveMatrix filename fmt m = do | ||
362 | charname <- newCString filename | ||
363 | charfmt <- newCString fmt | ||
364 | let o = if orderOf m == RowMajor then 1 else 0 | ||
365 | app1 (matrix_fprintf charname charfmt o) mat m "matrix_fprintf" | ||
366 | free charname | ||
367 | free charfmt | ||
368 | |||
369 | foreign import ccall "matrix_fprintf" matrix_fprintf :: Ptr CChar -> Ptr CChar -> CInt -> TM | ||
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs index 32eb991..ad0776e 100644 --- a/lib/Data/Packed/Matrix.hs +++ b/lib/Data/Packed/Matrix.hs | |||
@@ -30,7 +30,7 @@ module Data.Packed.Matrix ( | |||
30 | ident, diag, diagRect, takeDiag, | 30 | ident, diag, diagRect, takeDiag, |
31 | liftMatrix, liftMatrix2, | 31 | liftMatrix, liftMatrix2, |
32 | format, | 32 | format, |
33 | loadMatrix, fromFile, fileDimensions, | 33 | loadMatrix, saveMatrix, fromFile, fileDimensions, |
34 | readMatrix, fromArray2D | 34 | readMatrix, fromArray2D |
35 | ) where | 35 | ) where |
36 | 36 | ||
@@ -247,11 +247,15 @@ fileDimensions fname = do | |||
247 | then return (tot `div` c, c) | 247 | then return (tot `div` c, c) |
248 | else return (0,0) | 248 | else return (0,0) |
249 | 249 | ||
250 | {- | loads a matrix from a formatted ASCII file. | 250 | -- | Loads a matrix from an ASCII file formatted as a 2D table. |
251 | -} | ||
252 | loadMatrix :: FilePath -> IO (Matrix Double) | 251 | loadMatrix :: FilePath -> IO (Matrix Double) |
253 | loadMatrix file = fromFile file =<< fileDimensions file | 252 | loadMatrix file = fromFile file =<< fileDimensions file |
254 | 253 | ||
254 | -- | Loads a matrix from an ASCII file (the number of rows and columns must be known in advance). | ||
255 | fromFile :: FilePath -> (Int,Int) -> IO (Matrix Double) | ||
256 | fromFile filename (r,c) = reshape c `fmap` fscanfVector filename (r*c) | ||
257 | |||
258 | |||
255 | -- | rearranges the rows of a matrix according to the order given in a list of integers. | 259 | -- | rearranges the rows of a matrix according to the order given in a list of integers. |
256 | extractRows :: Element t => [Int] -> Matrix t -> Matrix t | 260 | extractRows :: Element t => [Int] -> Matrix t -> Matrix t |
257 | extractRows l m = fromRows $ extract (toRows $ m) l | 261 | extractRows l m = fromRows $ extract (toRows $ m) l |