背景
- C/C++ アプリで行列計算をする必要がある(e.g. SVD など).
- 主に点群レジストレーション
- Eigen でもいいが, 計算が速くなるなら専用のライブラリを使うのも検討したい.
- しかしなるべくクロスプラットフォームで, OSS(non-copyleft)がよくて, アーキテクチャや OS 依存は避けたい.
- 数値計算界隈はよくわからない
基礎知識
なんとなくの理解です. 基本は BLAS と LAPACK を押さえておけばよさそう.
- BLAS : 基本となる行列計算ルーチン
- LAPACK : SVD とか行列計算アルゴリズムが実装されている. BLAS を使っている. 通常 C/C++ アプリではだたい LAPACK の API を呼び出すのが多い... はず
基本 API は変わらない(fortran 時代)まま, みなさん BLAS/LAPACK を使っているようです(みんな昔から使っているので, あとから変えるのが難しいというのもありそう).
コードベース(source repo)はいろいろ派生があってわかりずらいです.
ライブラリのまとめ
- 素(?) の BLAS : fortran で書かれている. 古い.
- CBLAS : 基本的には f2c で C に変換したもの. OpenBLAS など, 最適化された BLAS が使えないときに, こちらをビルドして使うのが想定される. アセンブラは使っていないのでポータブルに動く(はず).
- OpenBLAS : アーキテクチャごとに最適化された BLAS. アセンブラを使っている. arm もある. https://qiita.com/syoyo/items/6f15ddc8eeb260bda433
- ATLAS : http://math-atlas.sourceforge.net/ BLAS API で BLAS を最適化したもの. LAPACK API もいくらかあるらしい. 最近は OpenBLAS が主流?
- LAPACK : fortran で書かれている.
- clapack : f2c で C に変換したもの. コンパイルは比較的楽. https://qiita.com/syoyo/items/09009ca77393cc0bd986
- lapacke : https://www.netlib.org/lapack/lapacke.html f2c ではなく手で書いた LAPACK C interface っぽい. より C から呼び出しやすい API になっている? https://stackoverflow.com/questions/26875415/difference-between-lapacke-and-lapack
- 現在は lapack の repo https://github.com/Reference-LAPACK/lapack (本家?) に取り込まれている
- ARPACK : https://www.caam.rice.edu/software/ARPACK/ 疎行列計算. f77 だったり f90 だったりいろいろ派生があるっぽい? LAPACK/BLAS を使っている模様
- superlu : https://directory.fsf.org/wiki/SuperLU 疎行列計算. LAPACK/BLAS を使っている.
C++ 行列ライブラリ
- Eigen : LAPACK/BLAS を使うオプションがある. https://eigen.tuxfamily.org/dox/TopicUsingBlasLapack.html
- MPL or GPL なのでちょっとライセンスが微妙(Eigen のコードをいじらなければ MPL で実質 MIT/BSD 系として使えはする)
- arnmadillo : http://arma.sourceforge.net/ ビルドに LAPACK/BLAS は必須. 疎行列の superlu, ARPACK は optional
- Apache 2.0 ライセンスなのがよい.
- blaze: https://bitbucket.org/blaze-lib/blaze/src/master/ BSD ライセンスでよい.
- Eigen のように基本テンプレートでヘッダオンリー.
- 自前(?)で疎行列も実装しているっぽい
- C++14 or later にはなるが, 機能一通りあり, 開発結構アクティブである, 今後の本命かも
疎行列専用ライブラリ
疎行列ライブラリはさらにいろいろあってよくわからない.
とりあえずは suitesparse と, superlu を押さえておけばよいか?
suitesparse はライセンスが混在していてつらい