hmatrix: Linear algebra and numerical computations

[ bsd3, library, math ] [ Propose Tags ]

A purely functional interface to basic linear algebra computations and other numerical routines, internally implemented using GSL, BLAS and LAPACK.

More information:

[Skip to Readme]


Automatic Flags

Choose the new smaller, split-up base package.


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Versions [RSS],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 0.20.1, 0.20.2
Dependencies array, base, haskell98, HUnit, QuickCheck, storable-complex [details]
License LicenseRef-GPL
Author Alberto Ruiz
Maintainer Alberto Ruiz <>
Category Numerical, Math
Home page
Uploaded by AlbertoRuiz at 2008-03-02T15:38:53Z
Distributions Debian:, LTSHaskell:0.20.2, NixOS:0.20.2, Stackage:0.20.2
Reverse Dependencies 123 direct, 54 indirect [details]
Downloads 74545 total (198 in the last 30 days)
Rating 2.5 (votes: 9) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for hmatrix-

[back to package description]
 A simple scientific library for Haskell

REQUIREMENTS ----------------------------

Development packages of:

1) GNU Scientific Library (

2) BLAS and LAPACK (

3) ATLAS (recommended) (

For example, in Ubuntu Linux we need:

- libgsl0-dev
- refblas3-dev
- lapack3-dev
- atlas3-base-dev (or a version specifically tuned for your machine)

For ghc-6.8.x you may also need:

- libgmp3-dev.

The following packages are used for simple graphics:

- gnuplot
- imagemagick

GNU-Octave can be used to check if the results
obtained by this library are correct.

INSTALLATION --------------------------------------

Automatic (using cabal-install and HackageDB):

    $ cabal install hmatrix


    Install storable-complex from HackageDB and then

    $ runhaskell Setup.lhs configure --prefix=$HOME --user
    $ runhaskell Setup.lhs build
    $ runhaskell Setup.lhs haddock
    $ runhaskell Setup.lhs install

See below for installation on Windows.

TESTS ---------------------------------------------

$ ghci
GHCi, version 6.8.2:  :? for help
Prelude> Numeric.LinearAlgebra.Tests.runTests 20

Additional tests with big matrices (taking a few minutes):

$ runhaskell examples/experiments bigtests

EXAMPLES ------------------------------------------------------

$ ghci
Prelude> :m + Numeric.GSL
Prelude Numeric.GSL> let quad = integrateQNG 1E-10
Prelude Numeric.GSL> quad (^2) 0 1

Prelude Numeric.GSL> :m + Numeric.LinearAlgebra
Prelude Numeric.LinearAlgebra> let m = (2><3)[1,2,3,4,5,6::Double]
Prelude Numeric.LinearAlgebra> let (u,d,v) = full svd m
Prelude Numeric.LinearAlgebra> d
 [ 9.508032000695724,                0.0, 0.0
 ,               0.0, 0.7728696356734838, 0.0 ]
Prelude Numeric.LinearAlgebra> u <> d <> trans v
 [ 1.0000000000000004,               2.0, 3.0
 , 3.9999999999999996, 5.000000000000001, 6.0 ]
Prelude Numeric.GSL> :q
Leaving GHCi.

A number of illustrative programs are included in the examples folder.

KNOWN PROBLEMS / BUGS -------------------------------

- Compilation with -O -fasm on 32-bit machines produces strange
  NaN's results on certain blas/lapack calls. In these machines
  the library is automatically compiled -fvia-C, which apparently
  solves the problem.
  On 64-bit the default and faster -fasm seems to work well.

- On 64-bit machines the example "minimize.hs", when run from ghci,
  produces a segmentation fault. It happens in the call to
  gsl_multimin_fdfminimizer_alloc, inside the C wrapper.
  If the program is called by runhaskell, it just terminates
  prematurely, producing no results. Curiously, in compiled mode the
  program seems to work perfectly well.

- On Ubuntu 6.06 LTS (Dapper) atlas3-sse2-dev (3.6.0-20)
  produces segmentation faults when working with big matrices 
  on compiled programs. To expose the problem:

  $ cd examples
  $ ghc --make -O -fvia-C tests.hs
  $ ./tests --big

  If this crashes, just uninstall atlas3-sse2 and use atlas3-base-dev instead.
  Fortunately, atlas3-sse2-dev seems to work well on Ubuntu 7.10 Gutsy.
  A similar problem was reported at:

CHANGES ---------------------------------------------------------

This is a new version of the library previously known as GSLHaskell.
It has been renamed to "hmatrix" because only a small part of GSL is actually
available, and most linear algebra is based on LAPACK.

The code has been extensively refactored. There is a new internal representation
which admits both C and Fortran matrices and avoids many transposes.

There are only minor API changes:

- The matrix product operator (<>) is now overloaded only for matrix-matrix,
  matrix-vector and vector-matrix, with the same base type. Dot product and scaling
  of vectors or matrices is now denoted by `dot` or (<.>) and `scale` or (.*).
  Conversions from real to complex objects must now be explicit.

- Most linear algebra functions admit both real and complex objects. Utilities such as
  ident or constant are now polymorphic.

- Runtime errors produced by GSL or LAPACK can be handled using Control.Exeception.catch.

Old GSLHaskell code will work with small modifications.

INSTALLATION ON WINDOWS ----------------------------------------

1) Download the developer files from
   and copy the gsl headers folder (under include) to:
   These headers are also available from:

2) Install the package as usual:
       runhaskell Setup.lhs configure
       runhaskell Setup.lhs build
       runhaskell Setup.lhs install

2.5) If configure cannot find ld please see:

3) Copy libgsl.dll, libcblas.dll (from the binaries package
   and liblapack.dll (borrowed from the R system) to the folder in which
   hmatrix has been installed: C:\Program Files\haskell\hmatrix-x.x.x.x\ghc-6.x.x.
   Rename libcblas.dll to libblas.dll.
   They are needed to compile programs.
   These three dlls are available from:

4) Copy the dlls available from:
   to the working directory or C:\windows\system
   They are required to run the programs and ghci.

5) run the tests

Unfortunately the lapack dll supplied by the R system does not include
zgels_, zgelss_, and zgees_, so the functions depending on them
(linearSolveLS, linearSolveSVD, and schur for complex data)
will produce a "non supported in this OS" runtime error.

If you find an alternative free and complete lapack.dll which works well
for this system please let me know.

The examples using graphics do not yet work in windows.

ACKNOWLEDGEMENTS -----------------------------------------------------

I thank Henning Thielemann and all the people in the Haskell mailing
lists for their help.

- Nico Mahlo discovered a bug in the eigendecomposition wrapper.

- Frederik Eaton discovered a bug in the design of the wrappers.

- Eric Kidd has created a wiki page explaining the installation on MacOS X:

- Fawzi Mohamed discovered a portability bug in the lapack wrappers.

- Pedro E. López de Teruel fixed the interface to lapack.

- Antti Siira discovered a bug in the plotting functions.

- Paulo Tanimoto helped to fix the configuration of the required libraries.
  He also discovered the segfault of minimize.hs in ghci.

- Xiao-Yong Jin reported a bug on x86_64 caused by the assumptions in f2c.h,
  which are wrong for this architecture.