@@ -29,7 +29,6 @@ module EigenSelfAdjoint
29
29
c /= h
30
30
s = inv (h)
31
31
else
32
- @show
33
32
c = one (c)
34
33
s = zero (c)
35
34
end
@@ -149,6 +148,7 @@ module EigenSelfAdjoint
149
148
n = length (d)
150
149
blockstart = 1
151
150
blockend = n
151
+ rotations = Givens{T}[]
152
152
@inbounds begin
153
153
while true
154
154
# Check for zero off diagonal elements
@@ -173,7 +173,7 @@ module EigenSelfAdjoint
173
173
μ = d[blockend] - (e[blockend - 1 ]/ (μ + copysign (r, μ)))
174
174
175
175
# QR bulk chase
176
- singleShiftQR! (S, μ, blockstart, blockend, vectors )
176
+ singleShiftQR! (S, μ, blockstart, blockend, rotations )
177
177
178
178
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], μ)
179
179
end
@@ -248,43 +248,45 @@ module EigenSelfAdjoint
248
248
end
249
249
e[istart] = si* π
250
250
d[istart] = shift + γi
251
- S
251
+ nothing
252
252
end
253
253
254
254
# 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
259
258
γi = d[istart] - shift
260
259
π = γi
261
- ci = one (eltype (S ))
262
- si = zero (eltype (S ))
260
+ ci = one (eltype (d ))
261
+ si = zero (eltype (e ))
263
262
for i = istart+ 1 : iend
264
263
ei = e[i- 1 ]
265
264
ci1 = ci
266
265
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)
268
269
if i > istart+ 1
269
270
e[i- 2 ] = si1* ζ
270
271
end
271
- di = d[i- 1 ]
272
+ di = d[i]
272
273
γi1 = γi
273
274
γi = ci* ci* (di - shift) - si* si* γi1
274
- d[i] = γi1 + di - γi
275
+ d[i- 1 ] = γi1 + di - γi
275
276
π = ci == 0 ? - ei* ci1 : γi/ ci
276
277
277
278
# 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)
284
286
end
285
287
e[iend- 1 ] = si* π
286
288
d[iend] = shift + γi
287
- S
289
+ nothing
288
290
end
289
291
290
292
function zeroshiftQR! {T} (A:: Bidiagonal{T} )
0 commit comments