Gauss-Jordan matrix inversion: Difference between revisions

Added 11l
(Added Algol 68)
(Added 11l)
Line 6:
'''A'''   being an   '''n''' × '''n'''   matrix.
<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}}==
1,481

edits