以下の記事は自身のブログData Science Struggleでも掲載予定。許可なき掲載とかではない。
概略
gonum/matrixでの行列の扱いについてまとめる。
Goでの機械学習パッケージのソースを読んでみるとgonum/matrixが使用されていたが、gonum/matrixによる行列操作について調べてみてもどうにも説明がわかりにくかったので備忘録がてらまとめていく。
gonum/matrixとは
Goから使用できる行列計算のパッケージ。内部ではBLASとLAPACKをあたっている。
インストール
go get github.com/gonum/matrix
コメントでご指摘いただき、以下のインストールが必要。
go get github.com/gonum/floats
具体的な使用方法
行列の作成
行列の作成は、mat64.NewDense()で行う。
//全ての要素を0で行列作成
zero := mat64.NewDense(3, 5, nil)
//スライスデータを行列に変換
data := make([]float64, 36)
for i := range data{
data[i] = float64(i)
}
data_matrix := mat64.NewDense(6,6,data)
上のコードで、最初の例では、3行5列、要素は全て0の行列を作成している。
これを出力してみると以下のようになる。
fmt.Println(zero)
&{{3 5 5 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]} 3 5}
次の例では、最初にスライスデータを作成し、それを行列に変換している。
出力を行うと以下のようになる。
fmt.Println(data_matrix)
&{{6 6 6 [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35]} 6 6}
行列は、初期値を与えての作成とスライスデータから変換によって作成することができる。
行列要素へのアクセス
作成した行列の要素にアクセスするにはAt関数で行列の行と列を指定することで行える。
fmt.Println(data_matrix.At(0,1))
1
指定した行を取り出す。
fmt.Println(data_matrix.RowView(3))
&{{1 [18 19 20 21 22 23]} 6}
行列演算
行列の計算は、計算結果を受け取る行列を作っておいて、以下のようにして行う。
a_elements := []float64{1,2,3,4}
b_elements := []float64{5,6,7,8}
c_elements := make([]float64, 4)
a_matrix := mat64.NewDense(2,2,a_elements)
b_matrix := mat64.NewDense(2,2,b_elements)
c_matrix := mat64.NewDense(2,2,c_elements)
fmt.Println("a_matrix")
fmt.Println(a_matrix)
fmt.Println("b_matrix")
fmt.Println(b_matrix)
c_matrix.Add(a_matrix, b_matrix)
fmt.Println("a_matrix + b_matrix")
fmt.Println(c_matrix)
c_matrix.Sub(a_matrix, b_matrix)
fmt.Println("a_matrix - b_matrix")
fmt.Println(c_matrix)
c_matrix.Mul(a_matrix, b_matrix)
fmt.Println("a_matrix * b_matrix")
fmt.Println(c_matrix)
出力結果は以下のようになる。
a_matrix
&{{2 2 2 [1 2 3 4]} 2 2}
b_matrix
&{{2 2 2 [5 6 7 8]} 2 2}
a_matrix + b_matrix
&{{2 2 2 [6 8 10 12]} 2 2}
a_matrix - b_matrix
&{{2 2 2 [-4 -4 -4 -4]} 2 2}
a_matrix * b_matrix
&{{2 2 2 [19 22 43 50]} 2 2}