gonum/matrix のデザインコンセプトに関するメモ

  • 11
    Like
  • 0
    Comment
More than 1 year has passed since last update.

github.com/gonum/matrix - Scientific math package for the Go language.

Goの線形代数のライブラリに関するただのメモです

APIは標準パッケージのmath/bigに則っている

https://groups.google.com/forum/#!searchin/gonum-dev/math$2Fbig/gonum-dev/uwlLBQg6tp0/4YwBJDdJBY4J
から引用:

In fact, the API is basically the same as in math/big. If you call M.Add(A,B) the result of A+B is stored in M. All of the operators are methods, not functions.

by David Neumann 2013/05/11

掛け算、足し算、引き算など、返り値は基本なし

math/bigとは違うので注意。メソッドのレシーバに結果が入るのは一緒

a := mat64.NewDense(2, 2, make([]float64, 1, 2, 3, 4))
b := mat64.NewDense(2, 2, make([]float64, 1, 2, 3, 4))
a.Add(a, b) // a = a + bを意味する

詳細は、作者の一人のDan Kortschakによる行列の掛け算の実装例を参考

返り値がほしいとき

a = a.Add(a, b)のように書きたいときは、自分でメソッドなり関数を書く。例えば以下

func Add(a, b *mat64.Dense) *mat64.Dense {
    a.Add(a, b)
    return a
} 

これで、以下のように書ける

a = Add(a, b) // a.Add(a, b) と同じ。人によってはわかりやすい表記かもしれない(少なくとも自分はそう)
a = Add(a, Add(b, c)) // a = a + b + c

その他雑多メモ

  • 返り値にポインタがほしいならclientが書く(↑の例、G+のポストでDan Kortschakはそう言ってる。デザインポリシーだと思う)
  • 返り値がない理由は、Dense, Sparse, .. 等行列の型に応じた実装が必要でかつ煩雑になってしまうから?(イマイチ納得しきれてない
  • おそらく、現時点で一番有力な線形代数のライブラリはgonum/matrixだと思う。ただしまだかなり発展途上。
  • 行列演算の内部ではblasが動いている
  • cublasをエンジンにしようとする計画もある(API Discussionより)
  • gonum/matrixはbiogoの一部からより使いやすい形で切り出そうとしてる印象をうける

参考