Jump to content

Gauss-Jordan matrix inversion: Difference between revisions

→‎{{header|Go}}: Trans PowerShell
(Fix the page to show Go)
(→‎{{header|Go}}: Trans PowerShell)
Line 568:
b.inverse().print("Inverse of B is:\n")
}</lang>
 
{{out}}
<pre>
Line 583 ⟶ 582:
[ 0.250000 0.500000 0.750000]
</pre>
===Alternative===
{{trans|PoweShell}}
<lang go>package main
import (
"fmt"
"math"
)
 
type vector = []float64
type matrix []vector
 
func (m matrix) print(title string) {
fmt.Println(title)
for _, v := range m {
fmt.Printf("% f\n", v)
}
}
 
func I(n int) matrix {
b := make(matrix, n)
for i := 0; i < n; i++ {
a := make(vector, n)
a[i] = 1
b[i] = a
}
return b
}
 
func (m matrix) inverse() matrix {
n := len(m)
for _, v := range m {
if (n != len(v)){
panic("Not a square matrix")
}
}
b := I(n)
a := make(matrix, n)
for i, v := range m {
row := make([]float64, n)
copy(row, v)
a[i] = row
}
for k := range a {
iMax := 0
max := -1.
for i := k; i < n; i++ {
row := a[i]
// compute scale factor s = max abs in row
s := -1.
for j := k; j < n; j++ {
x := math.Abs(row[j])
if x > s {
s = x
}
}
// scale the abs used to pick the pivot.
if abs := math.Abs(row[k]) / s; abs > max {
iMax = i
max = abs
}
}
if a[iMax][k] == 0 {
panic("Irregular matrix")
}
if k != iMax {
a[k], a[iMax] = a[iMax], a[k]
b[k], b[iMax] = b[iMax], b[k]
}
akk := a[k][k]
for j := 0; j < n; j++ {
a[k][j] /= akk
b[k][j] /= akk
}
for i := 0; i < n; i++ {
if (i != k) {
aik := a[i][k]
for j := 0; j < n; j++ {
a[i][j] -= a[k][j] * aik
b[i][j] -= b[k][j] * aik
}
}
}
}
return b
}
func main() {
a := matrix{{1, 2, 3}, {4, 1, 6}, {7, 8, 9}}
a.inverse().print("Inverse of A is:\n")
 
b := matrix{{2, -1, 0}, {-1, 2, -1}, {0, -1, 2}}
b.inverse().print("Inverse of B is:\n")
}</lang>
{{out}}
<pre>Same output than above</pre>
 
=={{header|Haskell}}==
678

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.