LoginSignup
0
1

More than 3 years have passed since last update.

gonum/matで単位行列を生成する

Posted at

コード

idSlice := make([]float64, n*n)
for i := 0; i < n; i++ {
    idSlice[i*(n+1)] = 1
}
idMat := mat.NewDense(n, n, idSlice)

これでできる。

サンプルコード

go get gonum.org/v1/gonum/matを実行して、コピペすれば動く。

package main

import (
    "fmt"

    "gonum.org/v1/gonum/mat"
)

func matPrint(X mat.Matrix) {
    fa := mat.Formatted(X, mat.Prefix(""), mat.Squeeze())
    fmt.Printf("%v\n", fa)
}

func main() {
    n := 4
    idSlice := make([]float64, n*n)
    for i := 0; i < n; i++ {
        idSlice[i*(n+1)] = 1
    }
    idMat := mat.NewDense(n, n, idSlice)

    matPrint(idMat)
}

解説

gonum/matでは、[]float64を渡して行列を作る。

例えば、3x3の単位行列

⎡1  0  0⎤
⎢0  1  0⎥
⎣0  0  1⎦

を作るには、要素数$3 \times 3 = 9$のスライス[1 0 0 0 1 0 0 0 1]を渡す。
これは、1を4個の要素ごとに、全部で3個代入したスライスである。

4x4の場合、

⎡1  0  0  0⎤
⎢0  1  0  0⎥
⎢0  0  1  0⎥
⎣0  0  0  1⎦

を作るには、要素数$4 \times 4 = 16$のスライス[1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]を渡す。
これは、1を5個の要素ごとに、全部で4個代入したスライスである。

つまり、nxnの場合、1をn+1個の要素ごとに、全部でn個代入したスライスを生成すれば良い。

これをコードに落とし込むと、

idSlice := make([]float64, n*n)

for i := 0; i < n; i++ {        //全部でn個
    idSlice[i*(n+1)] = 1        //1をn+1個の要素ごとに代入
}

となるので、あとは

idMat := mat.NewDense(n, n, idSlice)

でコンストラクタに渡せば良い。

0
1
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
0
1