GO : Inversing a Matrix

package main


import "fmt"


func main() {

a := [][]float64{{1, 2, 3}, {0, 1, 4}, {5, 6, 0}}

fmt.Println(a)

ainv := invMatrix(a)

fmt.Println(ainv)


}


func matRowScalarDiv(a [][]float64, I [][]float64, rowNumber int, divisor float64) [][]float64 {

null := [][]float64{}

if divisor != 0 {

for i := 0; i < len(a); i++ {

if i == rowNumber {

for j := 0; j < len(a[rowNumber]); j++ {

a[i][j] = a[i][j] / divisor

I[i][j] = I[i][j] / divisor

}

}

}

return a

} else {

return null

}

}

func neutralMatrixRow(a [][]float64, I [][]float64, neutralizingRow int) [][]float64 {

for i := 0; i < len(a); i++ {

if i != neutralizingRow {

if a[neutralizingRow][neutralizingRow] != 0 || I[neutralizingRow][neutralizingRow] != 0 {

neutralStar := a[i][neutralizingRow] / a[neutralizingRow][neutralizingRow]

for j := 0; j < len(a[i]); j++ {

a[i][j] = a[i][j] - a[neutralizingRow][j]*neutralStar

I[i][j] = I[i][j] - I[neutralizingRow][j]*neutralStar

}

}

}

}

return a

}

func invMatrix(a [][]float64) [][]float64 {

anew := [][]float64{}

//Inew := [][]float64{}

I := Imat(len(a))

for i := 0; i < len(a); i++ {

anew = matRowScalarDiv(a, I, i, a[i][i])

anew = neutralMatrixRow(anew, I, i)

}

return I

}

func Imat(n int) [][]float64 {

matrix := [][]float64{}

for i := 0; i < n; i++ {

mat2 := []float64{}

for j := 0; j < n; j++ {

if i == j {

mat2 = append(mat2, 1)

} else {

mat2 = append(mat2, 0)

}

}

matrix = append(matrix, mat2)

}

return matrix

}