行列計算用のHaskellライブラリ hmatrix を入れる. (Ubuntu 8.10)

http://www.hmatrix.googlepages.com/

概要

Haskellで行列計算したとき,あるじゃないですか.
そんなときは,hmatrixというライブラリを使おう.
でも標準ではインストールされない.それを使えるようにしよう.

目標

Haskellの行列計算用ライブラリ hmatrix
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hmatrix-0.5.0.1
をインストールし,使えるようにする.

環境

必要なHaskellライブラリのインストール

(cabal install を使うという方法もあるが,そんなに,ライブラリをインストールしないと思われるので,手動で)
とりあえず,依存関係は次のようになっている.

base (<3), haskell98, HUnit, QuickCheck, storable-complex or
array, base (>=3), haskell98, HUnit, QuickCheck, storable-complex

インストール済みのパッケージは

ghc-pkg -list

で分かる.
多分,array, base, haskell98はUbuntuでも標準で入っていると思う.
Hunit, QuickCheck は apt-get で入れられる.

sudo apt-get install libghc6-hunit-dev libghc6-quickcheck-dev

とか,-doc, -profもある.

storable-complexはapt-getでは入れられないみたい(パッケージがない).
そこで,
http://hackage.haskell.org/packages/archive/storable-complex/0.2/storable-complex-0.2.tar.gz
から,ソースをもらい,自分でインストールする.

tar -xzf storable-complex-0.2.tar.gz
cd storable-complex-0.2
runhaskell Setup configure
sudo runhaskell Setup install

インストール後 ghc-pkg -list とすると,

/usr/lib/ghc-6.8.2/package.conf:
    Cabal-1.2.3.0, HUnit-1.2.0.0, QuickCheck-1.1.0.0, array-0.1.0.0,
    base-3.0.1.0, bytestring-0.9.0.1, containers-0.1.0.1,
    directory-1.0.0.0, filepath-1.1.0.0, (ghc-6.8.2),
    haskell98-1.0.1.0, hpc-0.5.0.0, mtl-1.1.0.0, old-locale-1.0.0.0,
    old-time-1.0.0.0, packedstring-0.1.0.0, pretty-1.0.0.0,
    process-1.0.0.0, random-1.0.0.0, readline-1.0.1.0, rts-1.0,
    storable-complex-0.2, template-haskell-2.2.0.0, unix-2.3.0.0

こんな感じで,storable-complex-0.2がインストールされているのが分かる.
これで多分,依存関係は大丈夫.

他のライブラリのインストール

Haskellライブラリの他にもGSL, BLAS/LAPCKというものが必要らしい.

sudo apt-get install libgsl0-dev libblas-dev liblapack-dev libatlas-base-dev

これでインストールできる.
ついでに提案パッケージもインストールしておく

sudo apt-get install libblas-doc liblapack-doc libatlas3gf-3dnow libatlas3gf-sse libatlas3gf-ss

hmatrixのインストール

やっと,本題.

tar -xzf hmatrix-0.5.0.1.tar.gz
cd hmatrix-0.5.0.1
runhaskell Setup configure
runhaskell Setup build
sudo runhaskell Setup install

簡単.

テスト

% ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/  :? for help
Loading package base ... linking ... done.
Prelude> import Numeric.LinearAlgebra.Tests
Prelude Numeric.LinearAlgebra.Tests> runTests 20
Loading package array-0.1.0.0 ... linking ... done.
Loading package old-locale-1.0.0.0 ... linking ... done.
Loading package old-time-1.0.0.0 ... linking ... done.
Loading package random-1.0.0.0 ... linking ... done.
Loading package filepath-1.1.0.0 ... linking ... done.
Loading package directory-1.0.0.0 ... linking ... done.
Loading package unix-2.3.0.0 ... linking ... done.
Loading package process-1.0.0.0 ... linking ... done.
Loading package haskell98 ... linking ... done.
Loading package HUnit-1.2.0.0 ... linking ... done.
Loading package QuickCheck-1.1.0.0 ... linking ... done.
Loading package storable-complex-0.2 ... linking ... done.
Loading package hmatrix-0.5.0.1 ... linking ... done.
------ mult
OK, passed 100 tests.
OK, passed 100 tests.
OK, passed 100 tests.
OK, passed 100 tests.
------ lu
OK, passed 100 tests.
OK, passed 100 tests.
(中略)
------ some unit tests
Cases: 13  Tried: 13  Errors: 0  Failures: 0

どうやら,しっかりインストールされているようです.
めでたし,めでたし.

少し遊んでみる

plot.hsとして,次を作成.

import Numeric.LinearAlgebra
import Graphics.Plot
plot2D f n = mesh (f x y) where
    (x,y) = meshdom range range
    range = linspace n (-2,2)
sombrero :: (Floating a) => a -> a -> a
sombrero x y = exp (-r2) * cos (2*r2)
    where r2 = x*x+y*y
f :: (Floating a) => a -> a
f x = sin x + 0.5 * sin (5*x)
main = do
    let x = linspace 1000 (-4,4)
    mplot [f x]
    plot2D sombrero 40

そして,

ghc --make plot.hs
./plot

とすれば…
グラフが表示される!!
こんな感じ.


内部ではgnuplotimageMagickを使用してるらしい.