summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2014-06-12 14:15:05 +0200
committerAlberto Ruiz <aruiz@um.es>2014-06-12 14:15:05 +0200
commit01832377377142696645a2ea800af2db3d0fac15 (patch)
tree4988111123ac1e8ad4cc377bb713f8fff6ee3274 /packages
parent302a220b636d510ccf654e3671e8a93391c13523 (diff)
improved loadMatrix
Diffstat (limited to 'packages')
-rw-r--r--packages/base/src/C/vector-aux.c5
-rw-r--r--packages/base/src/Data/Packed/IO.hs12
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Data.hs2
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Util.hs5
-rw-r--r--packages/base/src/Numeric/Vectorized.hs2
5 files changed, 19 insertions, 7 deletions
diff --git a/packages/base/src/C/vector-aux.c b/packages/base/src/C/vector-aux.c
index efb82af..2f47c8f 100644
--- a/packages/base/src/C/vector-aux.c
+++ b/packages/base/src/C/vector-aux.c
@@ -654,6 +654,9 @@ int zipQ(int code, KQVEC(a), KQVEC(b), QVEC(r)) {
654int vectorScan(char * file, int* n, double**pp){ 654int vectorScan(char * file, int* n, double**pp){
655 FILE * fp; 655 FILE * fp;
656 fp = fopen (file, "r"); 656 fp = fopen (file, "r");
657 if(!fp) {
658 ERROR(BAD_FILE);
659 }
657 int nbuf = 100*100; 660 int nbuf = 100*100;
658 double * p = (double*)malloc(nbuf*sizeof(double)); 661 double * p = (double*)malloc(nbuf*sizeof(double));
659 int k=0; 662 int k=0;
@@ -667,7 +670,7 @@ int vectorScan(char * file, int* n, double**pp){
667 if (k==nbuf) { 670 if (k==nbuf) {
668 nbuf = nbuf * 2; 671 nbuf = nbuf * 2;
669 p = (double*)realloc(p,nbuf*sizeof(double)); 672 p = (double*)realloc(p,nbuf*sizeof(double));
670 //printf("R\n"); 673 // printf("R\n");
671 } 674 }
672 p[k++] = d; 675 p[k++] = d;
673 } 676 }
diff --git a/packages/base/src/Data/Packed/IO.hs b/packages/base/src/Data/Packed/IO.hs
index f7afa80..85f1b37 100644
--- a/packages/base/src/Data/Packed/IO.hs
+++ b/packages/base/src/Data/Packed/IO.hs
@@ -14,7 +14,7 @@
14 14
15module Data.Packed.IO ( 15module Data.Packed.IO (
16 dispf, disps, dispcf, vecdisp, latexFormat, format, 16 dispf, disps, dispcf, vecdisp, latexFormat, format,
17 readMatrix, fromArray2D, loadMatrix, saveMatrix 17 readMatrix, fromArray2D, loadMatrix, loadMatrix', saveMatrix
18) where 18) where
19 19
20import Data.Packed 20import Data.Packed
@@ -155,5 +155,13 @@ loadMatrix :: FilePath -> IO (Matrix Double)
155loadMatrix f = do 155loadMatrix f = do
156 v <- vectorScan f 156 v <- vectorScan f
157 c <- apparentCols f 157 c <- apparentCols f
158 return (reshape c v) 158 if (dim v `mod` c /= 0)
159 then
160 error $ printf "loadMatrix: %d elements and %d columns in file %s"
161 (dim v) c f
162 else
163 return (reshape c v)
164
165
166loadMatrix' name = mbCatch (loadMatrix name)
159 167
diff --git a/packages/base/src/Numeric/LinearAlgebra/Data.hs b/packages/base/src/Numeric/LinearAlgebra/Data.hs
index d5ce32f..b1a31fc 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Data.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Data.hs
@@ -55,7 +55,7 @@ module Numeric.LinearAlgebra.Data(
55 55
56 -- * IO 56 -- * IO
57 disp, 57 disp,
58 loadMatrix, saveMatrix, 58 loadMatrix, loadMatrix', saveMatrix,
59 latexFormat, 59 latexFormat,
60 dispf, disps, dispcf, format, 60 dispf, disps, dispcf, format,
61 dispDots, dispBlanks, dispShort, 61 dispDots, dispBlanks, dispShort,
diff --git a/packages/base/src/Numeric/LinearAlgebra/Util.hs b/packages/base/src/Numeric/LinearAlgebra/Util.hs
index b6f8966..6bb9d15 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Util.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Util.hs
@@ -416,7 +416,7 @@ c ~!~ msg = when c (error msg)
416 416
417formatSparse :: String -> String -> String -> Int -> Matrix Double -> String 417formatSparse :: String -> String -> String -> Int -> Matrix Double -> String
418 418
419formatSparse zeroI zeroF sep _ (approxInt -> Just m) = format sep f m 419formatSparse zeroI _zeroF sep _ (approxInt -> Just m) = format sep f m
420 where 420 where
421 f 0 = zeroI 421 f 0 = zeroI
422 f x = printf "%.0f" x 422 f x = printf "%.0f" x
@@ -424,7 +424,8 @@ formatSparse zeroI zeroF sep _ (approxInt -> Just m) = format sep f m
424formatSparse zeroI zeroF sep n m = format sep f m 424formatSparse zeroI zeroF sep n m = format sep f m
425 where 425 where
426 f x | abs (x::Double) < 2*peps = zeroI++zeroF 426 f x | abs (x::Double) < 2*peps = zeroI++zeroF
427 | abs (fromIntegral (round x) - x) / abs x < 2*peps = printf ("%.0f."++replicate n ' ') x 427 | abs (fromIntegral (round x::Int) - x) / abs x < 2*peps
428 = printf ("%.0f."++replicate n ' ') x
428 | otherwise = printf ("%."++show n++"f") x 429 | otherwise = printf ("%."++show n++"f") x
429 430
430approxInt m 431approxInt m
diff --git a/packages/base/src/Numeric/Vectorized.hs b/packages/base/src/Numeric/Vectorized.hs
index 936daba..6f0d240 100644
--- a/packages/base/src/Numeric/Vectorized.hs
+++ b/packages/base/src/Numeric/Vectorized.hs
@@ -294,7 +294,7 @@ vectorScan s = do
294 cs <- newCString s 294 cs <- newCString s
295 ok <- c_vectorScan cs pn pp 295 ok <- c_vectorScan cs pn pp
296 when (not (ok == 0)) $ 296 when (not (ok == 0)) $
297 error ("vectorScan \"" ++ s ++"\"") 297 error ("vectorScan: file \"" ++ s ++"\" not found")
298 n <- fromIntegral <$> peek pn 298 n <- fromIntegral <$> peek pn
299 p <- peek pp 299 p <- peek pp
300 v <- createVector n 300 v <- createVector n