@@ -2,29 +2,13 @@ using Printf
2
2
using LinearAlgebra
3
3
using LinearAlgebra: givensAlgorithm
4
4
5
- struct SymmetricTridiagonalFactorization{T} <: Factorization{T}
6
- uplo:: Char
7
- factors:: Matrix{T}
8
- τ:: Vector{T}
9
- diagonals:: SymTridiagonal
10
- end
11
-
12
- Base. size (S:: SymmetricTridiagonalFactorization , i:: Integer ) = size (S. factors, i)
13
-
5
+ # # EigenQ
14
6
struct EigenQ{T} <: AbstractMatrix{T}
15
7
uplo:: Char
16
8
factors:: Matrix{T}
17
9
τ:: Vector{T}
18
10
end
19
11
20
- function Base. getproperty (S:: SymmetricTridiagonalFactorization , s:: Symbol )
21
- if s == :Q
22
- return EigenQ (S. uplo, S. factors, S. τ)
23
- else
24
- return getfield (S, s)
25
- end
26
- end
27
-
28
12
Base. size (Q:: EigenQ ) = (size (Q. factors, 1 ), size (Q. factors, 1 ))
29
13
function Base. size (Q:: EigenQ , i:: Integer )
30
14
if i < 1
@@ -42,9 +26,8 @@ function LinearAlgebra.lmul!(Q::EigenQ, B::StridedVecOrMat)
42
26
throw (DimensionMismatch (" " ))
43
27
end
44
28
if Q. uplo == ' L'
45
- for k = length (Q. τ): - 1 : 1
29
+ @inbounds for k = length (Q. τ): - 1 : 1
46
30
for j = 1 : size (B, 2 )
47
- b = view (B, :, j)
48
31
vb = B[k+ 1 , j]
49
32
for i = (k+ 2 ): m
50
33
vb += Q. factors[i, k]' B[i, j]
@@ -57,9 +40,8 @@ function LinearAlgebra.lmul!(Q::EigenQ, B::StridedVecOrMat)
57
40
end
58
41
end
59
42
elseif Q. uplo == ' U'
60
- for k = length (Q. τ): - 1 : 1
43
+ @inbounds for k = length (Q. τ): - 1 : 1
61
44
for j = 1 : size (B, 2 )
62
- b = view (B, :, j)
63
45
vb = B[k+ 1 , j]
64
46
for i = (k+ 2 ): m
65
47
vb += Q. factors[k, i] * B[i, j]
120
102
121
103
Base. Array (Q:: EigenQ ) = lmul! (Q, Matrix {eltype(Q)} (I, size (Q, 1 ), size (Q, 1 )))
122
104
105
+
106
+ # # SymmetricTridiagonalFactorization
107
+ struct SymmetricTridiagonalFactorization{T,Treal,S} <: Factorization{T}
108
+ reflectors:: EigenQ{T}
109
+ diagonals:: SymTridiagonal{Treal,S}
110
+ end
111
+
112
+ Base. size (S:: SymmetricTridiagonalFactorization , i:: Integer ) = size (S. reflectors. factors, i)
113
+
114
+ function Base. getproperty (S:: SymmetricTridiagonalFactorization , s:: Symbol )
115
+ if s == :Q
116
+ return S. reflectors
117
+ else
118
+ return getfield (S, s)
119
+ end
120
+ end
121
+
122
+ # # Eigen solvers
123
123
function _updateVectors! (c, s, j, vectors)
124
124
@inbounds for i = 1 : size (vectors, 1 )
125
125
v1 = vectors[i, j+ 1 ]
@@ -510,9 +510,11 @@ function symtriLower!(
510
510
end
511
511
end
512
512
SymmetricTridiagonalFactorization (
513
- ' L' ,
514
- AS,
515
- τ,
513
+ EigenQ (
514
+ ' L' ,
515
+ AS,
516
+ τ,
517
+ ),
516
518
SymTridiagonal (real (diag (AS)), real (diag (AS, - 1 ))),
517
519
)
518
520
end
@@ -564,9 +566,11 @@ function symtriUpper!(
564
566
end
565
567
end
566
568
SymmetricTridiagonalFactorization (
567
- ' U' ,
568
- AS,
569
- τ,
569
+ EigenQ (
570
+ ' U' ,
571
+ AS,
572
+ τ,
573
+ ),
570
574
SymTridiagonal (real (diag (AS)), real (diag (AS, 1 ))),
571
575
)
572
576
end
0 commit comments