LoginSignup
11
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-05

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

参考

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10