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の一部からより使いやすい形で切り出そうとしてる印象をうける