Clojure行列計算業界 @2018年末
この記事はRで書かれたライブラリをClojureでリバースエンジニアリングすることに取り組むことになったものの、
大学を卒業してから一度も行列計算してないので復習兼ねてClojure界隈の事情を調べてようと思って書いた記事になります。
今回調べたライブラリ
core.matrix実装
vectorzをラップ
core.matrix実装
強そう
2大勢力
Mike Andersonは先行してcore.matrixを開発していた
プロトコルを提供してバックエンドをユースケースに合わせて差し替え可能にする思想
Dragan Djuric氏は最高のパフォーマンスを出すことを優先する思想っぽい
neanderthalやってみた
code:clojure
(ns example
(dv 1 2 3)
=>
[Error printing return value (UnsatisfiedLinkError) at java.lang.ClassLoader$NativeLibrary/load (ClassLoader.java:-2).
/tmp/libneanderthal-mkl-0.20.02365404628192435086.so: libmkl_rt.so: cannot open shared object file: No such file or directory
oh...
後でこういう感じのmklインストール済みのdockerコンテナ作ってその上でやってみたいという気持だけ書いて断念した
clatrixやってみた
deps.ednに:deps {clatrix {:mvn/version "0.5.0"}}を足す
https://gyazo.com/11ef154d82697d8eae0ba6ab13d7d98a
綺麗な場合では
Ax=b => (inv A)Ax=(inv A)b => x=(inv A)b なのでAの逆行列がわかればxが求められる。
clatrixでは以下のように書ける
code:clojure
(def A (c/matrix
(def b (c/matrix
(def A-inv (c/i A))
;; A-inv =>
;;((0.33333333333333326 -1.3333333333333321 0.9999999999999996)
;; (-0.3333333333333332 2.333333333333332 -0.9999999999999994)
;; (0.9999999999999996 -8.999999999999996 3.9999999999999982))
(def x (c/* A-inv b))
;; x => (-1.0000000000000018 1.7763568394002505E-15 11.999999999999996)
(c/* A x)
=> (-37.00000000000001 -1.0 10.000000000000002)
depsに足すだけでインストールの手間無く動いた 😂
APIが直感的で良いのでは
まとめ
neanderthalはjarを落としただけでは動かない
dockerイメージ整備すればあるいは 🤔
とりあえず仕事ではvectorzを使いたい気持ち
clatrixは最終コミットが2015年。。。
neanderthalはout of boxで動かなそう
あやぴーのフィードバックを受けて文章として少しはまとまったものを書いてみました。どうでしょう。
https://gyazo.com/76ffa94182aa56ed8c29dd609cbb2978