[LISP] 数値計算ライブラリ

研究で多変量正規分布を扱うプログラムを書く必要が出てきたので、共分散行列の計算をするためにCommon Lispで行列演算をするためのライブラリを探していた。
使っている処理系がSBCLなので、matlispは使えない。
http://d.hatena.ne.jp/niitsuma/20080325
ここを見ていたらcl-numlibというのがあったので試してみようかと思う。

  • 結局、行列関係の関数は行列積しかなかった・・・ 他にはcl-mathstatsがあるが行列積と逆行列くらいしかない。行列の分解とかはちゃんとした統計解析用の数値計算ソフトを使うしかないのかなー。

これを期にRをやろうかなー。Schemeを元にした構文らしいし、「Rの基礎とプログラミング技法」も買ったし。

GSLL

と思ったらGSL(GNU Scientific Library)のCommon Lisp用のラッパーがあった。
GNU Scientific Library for Lisp
http://common-lisp.net/project/gsll/

インストールにつまったのでメモ。


あらかじめSubversionとGSLとCFFIとASDFはインストールしておく。
personal installだと~/.sbcl/site/以下で下を実行してファイルを取ってくる。

svn list svn://common-lisp.net/project/gsll/svn/trunk
svn checkout svn://common-lisp.net/project/gsll/svn/trunk gsll

すると~/.sbcl/site/gsll/ができているので~/.sbcl/system/gsll.asdから~/.sbcl/site/gsll/gsll.asdシンボリックリンクを張る。

次に~/.sbcl/site/gsll/init/init.lispを開いてlibgslライブラリのパスを修正。

普通にコンパイルするとcffi:defcvarでひっかかる。
~/.sbcl/site/gsll/init/interface.lispの以下の部分

;;;;****************************************************************************
;;;; Variables in library
;;;;****************************************************************************

(defmacro defmpar (cl-symbol gsl-symbol documentation)
  "Define a library variable pointer."
  `(progn
    (cffi:defcvar (,gsl-symbol ,cl-symbol :read-only t) :pointer
      ,documentation)                                             ←ココ!
    (map-name ',cl-symbol ,gsl-symbol)
    (export ',cl-symbol)))

;;;;****************************************************************************
;;;; GSL library version
;;;;****************************************************************************

(cffi:defcvar ("gsl_version" *gsl-version* :read-only t) :string
          "The version of the GSL library being used.")
(map-name '*gsl-version* "gsl_version")
(export '*gsl-version*)

を以下のように修正。

;;;;****************************************************************************
;;;; Variables in library
;;;;****************************************************************************

(defmacro defmpar (cl-symbol gsl-symbol documentation)
  "Define a library variable pointer."
  `(progn
    (cffi:defcvar (,gsl-symbol ,cl-symbol :read-only t) :pointer
      ) ;,documentation
    (map-name ',cl-symbol ,gsl-symbol)
    (export ',cl-symbol)))

;;;;****************************************************************************
;;;; GSL library version
;;;;****************************************************************************

(cffi:defcvar ("gsl_version" *gsl-version* :read-only t) :string
          ) ;"The version of the GSL library being used."
(map-name '*gsl-version* "gsl_version")
(export '*gsl-version*)

これで(asdf:oos 'asdf:load-op :gsll)でコンパイルできた。

NLISP

開発が続いている数少ないライブラリの一つ。
asdf-installからインストールできてSBCLにも対応している。
0.80からGSLのラッパー機能がついた。

インストール
libsndfile.soが必要なので/usr/ports/audio/libsndfile/に移動してmake & make install

CMUの数学ライブラリ(CMU Artificial Intelligence Repository)

http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/math/0.html
基本的な行列演算やコレスキー分解,QR分解など.
行列をCommon Lispの2次元配列として扱う素直な実装.