Skip to content

Commit

Permalink
Fix JuliaLang#10262. Multiply with inverse instead of dividing inside…
Browse files Browse the repository at this point in the history
… the loop in chol!
  • Loading branch information
andreasnoack committed Feb 20, 2015
1 parent 8c87a32 commit 8dd5046
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions base/linalg/cholesky.jl
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,14 @@ function chol!{T}(A::AbstractMatrix{T})
for i = 1:k - 1
A[k,k] -= A[i,k]'A[i,k]
end
A[k,k] = chol!(A[k,k], :U)
AkkInv = inv(A[k,k])
Akk = chol!(A[k,k], :U)
A[k,k] = Akk
AkkInv = inv(Akk')
for j = k + 1:n
for i = 1:k - 1
A[k,j] -= A[i,k]'A[i,j]
end
A[k,j] = A[k,k]'\A[k,j]
A[k,j] = AkkInv*A[k,j]
end
end
end
Expand All @@ -54,12 +55,18 @@ function chol!{T}(A::AbstractMatrix{T}, uplo::Symbol)
for i = 1:k - 1
A[k,k] -= A[k,i]*A[k,i]'
end
A[k,k] = chol!(A[k,k], uplo)
AkkInv = inv(A[k,k]')
println(A[k,k])
Akk = chol!(A[k,k], uplo)
A[k,k] = Akk
AkkInv = inv(Akk)
for j = 1:k
for i = k + 1:n
j == 1 && (A[i,k] = A[i,k]*AkkInv)
j < k && (A[i,k] -= A[i,j]*A[k,j]'*AkkInv)
if j == 1
A[i,k] = A[i,k]*AkkInv'
end
if j < k
A[i,k] -= A[i,j]*A[k,j]'*AkkInv'
end
end
end
end
Expand All @@ -68,13 +75,14 @@ function chol!{T}(A::AbstractMatrix{T}, uplo::Symbol)
for i = 1:k - 1
A[k,k] -= A[i,k]'A[i,k]
end
A[k,k] = chol!(A[k,k], uplo)
AkkInv = inv(A[k,k])
Akk = chol!(A[k,k], uplo)
A[k,k] = Akk
AkkInv = inv(Akk')
for j = k + 1:n
for i = 1:k - 1
A[k,j] -= A[i,k]'A[i,j]
end
A[k,j] = A[k,k]'\A[k,j]
A[k,j] = AkkInv*A[k,j]
end
end
else
Expand Down

0 comments on commit 8dd5046

Please sign in to comment.