Skip to content

Commit b1cb849

Browse files
committed
Adjust symmetric eigenvalue problem to be less storage sensitive, i.e. not
work on eigenvectors scalar by scalar during QR/QL iterations
1 parent 5946586 commit b1cb849

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

src/eigenSelfAdjoint.jl

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ module EigenSelfAdjoint
2929
c /= h
3030
s = inv(h)
3131
else
32-
@show
3332
c = one(c)
3433
s = zero(c)
3534
end
@@ -149,6 +148,7 @@ module EigenSelfAdjoint
149148
n = length(d)
150149
blockstart = 1
151150
blockend = n
151+
rotations = Givens{T}[]
152152
@inbounds begin
153153
while true
154154
# Check for zero off diagonal elements
@@ -173,7 +173,7 @@ module EigenSelfAdjoint
173173
μ = d[blockend] - (e[blockend - 1]/+ copysign(r, μ)))
174174

175175
# QR bulk chase
176-
singleShiftQR!(S, μ, blockstart, blockend, vectors)
176+
singleShiftQR!(S, μ, blockstart, blockend, rotations)
177177

178178
debug && @printf("QR, blockstart: %d, blockend: %d, e[blockstart]: %e, e[blockend-1]:%e, d[blockend]: %f, μ: %f\n", blockstart, blockend, e[blockstart], e[blockend-1], d[blockend], μ)
179179
end
@@ -248,43 +248,45 @@ module EigenSelfAdjoint
248248
end
249249
e[istart] = si*π
250250
d[istart] = shift + γi
251-
S
251+
nothing
252252
end
253253

254254
# Own implementation based on Parlett's book
255-
function singleShiftQR!(S::SymTridiagonal, shift::Number, istart::Integer = 1, iend::Integer = length(S.dv), vectors = zeros(eltype(S), 0, size(S, 1)))
256-
d = S.dv
257-
e = S.ev
258-
n = length(d)
255+
function singleShiftQR!(d::AbstractVector, e::AbstractVector, shift::Number, istart::Integer = 1, iend::Integer = length(d), rotations = LinAlg.Givens{eltype(d)}[])
256+
# d = S.dv
257+
# e = S.ev
259258
γi = d[istart] - shift
260259
π = γi
261-
ci = one(eltype(S))
262-
si = zero(eltype(S))
260+
ci = one(eltype(d))
261+
si = zero(eltype(e))
263262
for i = istart+1:iend
264263
ei = e[i-1]
265264
ci1 = ci
266265
si1 = si
267-
ci, si, ζ = givensAlgorithm(π, ei)
266+
G, ζ = givens(π, ei, i - 1, i)
267+
ci, si = G.c, G.s
268+
# ci, si, ζ = givensAlgorithm(π, ei)
268269
if i > istart+1
269270
e[i-2] = si1*ζ
270271
end
271-
di = d[i-1]
272+
di = d[i]
272273
γi1 = γi
273274
γi = ci*ci*(di - shift) - si*si*γi1
274-
d[i] = γi1 + di - γi
275+
d[i-1] = γi1 + di - γi
275276
π = ci == 0 ? -ei*ci1 : γi/ci
276277

277278
# update eigen vectors
278-
for k = 1:size(vectors, 1)
279-
v1 = vectors[k, i - 1]
280-
v2 = vectors[k, i]
281-
vectors[k, i - 1] = ci*v1 + si*v2
282-
vectors[k, i] = ci*v2 - si*v1
283-
end
279+
# for k = 1:size(vectors, 1)
280+
# v1 = vectors[k, i - 1]
281+
# v2 = vectors[k, i]
282+
# vectors[k, i - 1] = ci*v1 + si*v2
283+
# vectors[k, i] = ci*v2 - si*v1
284+
# end
285+
push!(rotations, G)
284286
end
285287
e[iend-1] = si*π
286288
d[iend] = shift + γi
287-
S
289+
nothing
288290
end
289291

290292
function zeroshiftQR!{T}(A::Bidiagonal{T})

0 commit comments

Comments
 (0)