I developed a small package to do matrix math. I just learned Go so I may have done it wrong.
package matrix
import "fmt"
import "errors"
import "math"
type Matrix [][]float64
func Print(m Matrix) {
fmt.Println(m)
}
func Zeros(rows, cols int) Matrix {
m := make([][]float64, rows)
for i := 0; i < rows; i++ {
m[i] = make([]float64, cols)
}
return m
}
func Map(f func(float64) float64, m Matrix) Matrix {
mapped := Zeros(len(m), len(m[0]))
for i, row := range m {
for j, val := range row {
mapped[i][j] = f(val)
}
}
return mapped
}
func Norm(m Matrix) float64 {
var norm float64
for _, row := range m {
for _, val := range row {
norm += math.Abs(val)
}
}
return norm
}
func Transpose(m Matrix) Matrix {
transposed := Zeros(len(m[0]), len(m))
for i, row := range m {
for j, val := range row {
transposed[j][i] = val
}
}
return transposed
}
func Multiply(a, b Matrix) (Matrix, error) {
if len(a[0]) != len(b) {
return nil, errors.New("Multiplication is not defined")
}
m := Zeros(len(a), len(b[0]))
for i := 0; i < len(a); i++ {
for j := 0; j < len(b[0]); j++ {
for k := 0; k < len(b); k++ {
m[i][j] += a[i][k] * b[k][j]
}
}
}
return m, nil
}
And here is a code using the package:
package main
import "matrix"
func main() {
m := matrix.Map(func (f float64) float64 {
return 1
}, matrix.Zeros(2, 2))
prod, _ := matrix.Multiply(m, m)
println(matrix.Norm(prod))
}