コード
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)
でコンストラクタに渡せば良い。