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
}