Gauss-Jordan matrix inversion: Difference between revisions

Content added Content deleted
(Added Algol 68)
(Added 11l)
Line 6: Line 6:
'''A'''   being an   '''n''' × '''n'''   matrix.
'''A'''   being an   '''n''' × '''n'''   matrix.
<br><br>
<br><br>

=={{header|11l}}==
{{trans|Nim}}

<lang 11l>V Eps = 1e-10

F transformToRref(&mat)
V lead = 0

L(r) 0 .< mat.len
I lead >= mat[0].len
R

V i = r
L mat[i][lead] == 0
i++
I i == mat.len
i = r
lead++
I lead == mat[0].len
R
swap(&mat[i], &mat[r])

V d = mat[r][lead]
I abs(d) > Eps
L(&item) mat[r]
item /= d

L(i) 0 .< mat.len
I i != r
V m = mat[i][lead]
L(c) 0 .< mat[0].len
mat[i][c] -= mat[r][c] * m

lead++

F inverse(mat)
V augmat = [[0.0] * (2 * mat.len)] * mat.len
L(i) 0 .< mat.len
L(j) 0 .< mat.len
augmat[i][j] = mat[i][j]
augmat[i][mat.len + i] = 1

transformToRref(&augmat)

V result = [[0.0] * mat.len] * mat.len
L(i) 0 .< mat.len
L(j) 0 .< mat.len
I augmat[i][j] != Float(i == j)
X ValueError(‘matrix is singular’)
result[i][j] = augmat[i][mat.len + j]
R result

F print_mat(mat)
L(row) mat
V line = ‘’
L(val) row
I !line.empty
line ‘’= ‘ ’
line ‘’= ‘#3.5’.format(val)
print(line)

F runTest(mat)
print(‘Matrix:’)
print_mat(mat)
print()
print(‘Inverse:’)
print_mat(inverse(mat))
print()
print()

V m1 = [[Float(1), 2, 3],
[Float(4), 1, 6],
[Float(7), 8, 9]]

V m2 = [[Float( 2), -1, 0],
[Float(-1), 2, -1],
[Float( 0), -1, 2]]

V m3 = [[Float(-1), -2, 3, 2],
[Float(-4), -1, 6, 2],
[Float( 7), -8, 9, 1],
[Float( 1), -2, 1, 3]]

runTest(m1)
runTest(m2)
runTest(m3)</lang>

{{out}}
<pre>
Matrix:
1.00000 2.00000 3.00000
4.00000 1.00000 6.00000
7.00000 8.00000 9.00000

Inverse:
-0.81250 0.12500 0.18750
0.12500 -0.25000 0.12500
0.52083 0.12500 -0.14583


Matrix:
2.00000 -1.00000 0.00000
-1.00000 2.00000 -1.00000
0.00000 -1.00000 2.00000

Inverse:
0.75000 0.50000 0.25000
0.50000 1.00000 0.50000
0.25000 0.50000 0.75000


Matrix:
-1.00000 -2.00000 3.00000 2.00000
-4.00000 -1.00000 6.00000 2.00000
7.00000 -8.00000 9.00000 1.00000
1.00000 -2.00000 1.00000 3.00000

Inverse:
-0.91304 0.24638 0.09420 0.41304
-1.65217 0.65217 0.04348 0.65217
-0.69565 0.36232 0.07971 0.19565
-0.56522 0.23188 -0.02899 0.56522


</pre>


=={{header|360 Assembly}}==
=={{header|360 Assembly}}==