Jump to content

LU decomposition: Difference between revisions

m
No edit summary
m (→‎{{header|Sidef}}: updated code)
Line 5,582:
<syntaxhighlight lang="ruby">func is_square(m) { m.all { .len == m.len } }
func matrix_zero(n, m=n) { m.of { n.of(0) } }
func matrix_ident(n) { n.of {|i| n[i.of(0)..., {|j|1, i==j(n ?- 1i :- 1).of(0 })...] } }
 
 
func pivotize(m) {
var size = m.len
var id = matrix_ident(size)
for i in (^size) {
var max = m[i][i]
var row = i
for j in (i ..^ size-1) {
if (m[j][i] > max) {
max = m[j][i]
Line 5,596:
}
}
if (row  != i) {
id.swap(row, i)
}
Line 5,602:
return id
}
 
 
func mmult(a, b) {
var p = []
for r,c (in ^a, ~Xc in ^b[0]), i in ^b {
forp[r][c] i:= 0 += (^a[r][i] * b[i][c]) {
p[r][c] := 0 += (a[r][i] * b[i][c])
}
}
return p
}
 
 
func lu(a) {
is_square(a) || die "Defined only for square matrices!";
Line 5,620 ⟶ 5,618:
var L = matrix_ident(n)
var U = matrix_zero(n)
for i,j (in ^n, j ~Xin ^n) {
if (j >= i) {
U[i][j] = (Aʼ[i][j] - sum(^i, { U[_][j] * L[i][_] }.map(^i).sum))
} else {
L[i][j] = ((Aʼ[i][j] - sum(^j, { U[_][j] * L[i][_] }.map(^j).sum)) / U[j][j])
}
}
return [P, Aʼ, L, U]
}
 
 
func say_it(message, array) {
say "\n#{message}"
Line 5,636 ⟶ 5,634:
}
}
 
 
var t = [[
%n(1 3 5),
Line 5,647 ⟶ 5,645:
%n( 2 5 7 1),
]]
 
 
t.each { |test|
for test (t) {
say_it('A Matrix', test);
for a,b in (['P Matrix', 'Aʼ Matrix', 'L Matrix', 'U Matrix'] ~Z lu(test)) {
say_it(a, b)
}
2,747

edits

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