LAPACK/BLAS など行列計算系ライブラリのメモ(C/C++ から使う用)


背景

  • 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)はいろいろ派生があってわかりずらいです.

ライブラリのまとめ

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 はライセンスが混在していてつらい