[LISP] 数値計算ライブラリ
研究で多変量正規分布を扱うプログラムを書く必要が出てきたので、共分散行列の計算をするためにCommon Lispで行列演算をするためのライブラリを探していた。
使っている処理系がSBCLなので、matlispは使えない。
http://d.hatena.ne.jp/niitsuma/20080325
ここを見ていたらcl-numlibというのがあったので試してみようかと思う。
これを期に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*)
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次元配列として扱う素直な実装.