LoginSignup
9
6

More than 5 years have passed since last update.

【Go】gonum/matrixでの行列の扱い【機械学習のために】

Last updated at Posted at 2017-07-29

以下の記事は自身のブログ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}

参考サイト

9
6
2

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
9
6