37
37
bandwidths (A:: SymmetricBandedToeplitzPlusHankel{T} ) where T = (A. b, A. b)
38
38
39
39
#
40
- # Jac* W-W*Jac' = G*J*G'
40
+ # X' W-W*X = G*J*G'
41
41
# This returns G and J, where J = [0 I; -I 0], respecting the skew-symmetry of the right-hand side.
42
42
#
43
43
function compute_skew_generators (A:: SymmetricToeplitzPlusHankel{T} ) where T
@@ -56,80 +56,82 @@ function cholesky(A::SymmetricToeplitzPlusHankel{T}) where T
56
56
n = size (A, 1 )
57
57
G, J = compute_skew_generators (A)
58
58
L = zeros (T, n, n)
59
- r = A[:, 1 ]
60
- r2 = zeros (T, n)
59
+ c = A[:, 1 ]
60
+ ĉ = zeros (T, n)
61
61
l = zeros (T, n)
62
62
v = zeros (T, n)
63
- col1 = zeros (T, n)
64
- STPHcholesky! (L, G, r, r2 , l, v, col1 , n)
63
+ row1 = zeros (T, n)
64
+ STPHcholesky! (L, G, c, ĉ , l, v, row1 , n)
65
65
return Cholesky (L, ' L' , 0 )
66
66
end
67
67
68
- function STPHcholesky! (L:: Matrix{T} , G, r, r2 , l, v, col1 , n) where T
68
+ function STPHcholesky! (L:: Matrix{T} , G, c, ĉ , l, v, row1 , n) where T
69
69
@inbounds @simd for k in 1 : n- 1
70
- x = sqrt (r [1 ])
70
+ d = sqrt (c [1 ])
71
71
for j in 1 : n- k+ 1
72
- L[j+ k- 1 , k] = l[j] = r [j]/ x
72
+ L[j+ k- 1 , k] = l[j] = c [j]/ d
73
73
end
74
74
for j in 1 : n- k+ 1
75
- v[j] = G[j, 1 ]* G[1 ,2 ] - G[j,2 ]* G[1 ,1 ]
75
+ v[j] = G[j, 1 ]* G[1 , 2 ] - G[j, 2 ]* G[1 , 1 ]
76
76
end
77
- F12 = k == 1 ? T (2 ) : T (1 )
78
- r2 [1 ] = (r [2 ] - v[1 ])/ F12
77
+ X21 = k == 1 ? T (2 ) : T (1 )
78
+ ĉ [1 ] = (c [2 ] - v[1 ])/ X21
79
79
for j in 2 : n- k
80
- r2 [j] = (r [j+ 1 ]+ r [j- 1 ] + r [1 ]* col1 [j] - col1 [1 ]* r [j] - v[j])/ F12
80
+ ĉ [j] = (c [j+ 1 ] + c [j- 1 ] + c [1 ]* row1 [j] - row1 [1 ]* c [j] - v[j])/ X21
81
81
end
82
- r2 [n- k+ 1 ] = (r [n- k] + r [1 ]* col1 [n- k+ 1 ] - col1 [1 ]* r [n- k+ 1 ] - v[n- k+ 1 ])/ F12
83
- cst = r [2 ]/ x
82
+ ĉ [n- k+ 1 ] = (c [n- k] + c [1 ]* row1 [n- k+ 1 ] - row1 [1 ]* c [n- k+ 1 ] - v[n- k+ 1 ])/ X21
83
+ cst = c [2 ]/ d
84
84
for j in 1 : n- k
85
- r [j] = r2 [j+ 1 ] - cst* l[j+ 1 ]
85
+ c [j] = ĉ [j+ 1 ] - cst* l[j+ 1 ]
86
86
end
87
+ cst = X21/ d
87
88
for j in 1 : n- k
88
- col1 [j] = - F12 / x * l[j+ 1 ]
89
+ row1 [j] = - cst * l[j+ 1 ]
89
90
end
90
- c1 = G[1 , 1 ]
91
- c2 = G[1 , 2 ]
91
+ gd1 = G[1 , 1 ]/ d
92
+ gd2 = G[1 , 2 ]/ d
92
93
for j in 1 : n- k
93
- G[j, 1 ] = G[j+ 1 , 1 ] - l[j+ 1 ]* c1 / x
94
- G[j, 2 ] = G[j+ 1 , 2 ] - l[j+ 1 ]* c2 / x
94
+ G[j, 1 ] = G[j+ 1 , 1 ] - l[j+ 1 ]* gd1
95
+ G[j, 2 ] = G[j+ 1 , 2 ] - l[j+ 1 ]* gd2
95
96
end
96
97
end
97
- L[n, n] = sqrt (r [1 ])
98
+ L[n, n] = sqrt (c [1 ])
98
99
end
99
100
100
101
function cholesky (A:: SymmetricBandedToeplitzPlusHankel{T} ) where T
101
102
n = size (A, 1 )
102
103
b = A. b
103
104
R = BandedMatrix {T} (undef, (n, n), (0 , bandwidth (A, 2 )))
104
- r = A[1 : b+ 2 , 1 ]
105
- r2 = zeros (T, b+ 3 )
105
+ c = A[1 : b+ 2 , 1 ]
106
+ ĉ = zeros (T, b+ 3 )
106
107
l = zeros (T, b+ 3 )
107
- col1 = zeros (T, b+ 2 )
108
- SBTPHcholesky! (R, r, r2 , l, col1 , n, b)
108
+ row1 = zeros (T, b+ 2 )
109
+ SBTPHcholesky! (R, c, ĉ , l, row1 , n, b)
109
110
return Cholesky (R, ' U' , 0 )
110
111
end
111
112
112
- function SBTPHcholesky! (R:: BandedMatrix{T} , r, r2 , l, col1 , n, b) where T
113
+ function SBTPHcholesky! (R:: BandedMatrix{T} , c, ĉ , l, row1 , n, b) where T
113
114
@inbounds @simd for k in 1 : n
114
- x = sqrt (r [1 ])
115
+ d = sqrt (c [1 ])
115
116
for j in 1 : b+ 1
116
- l[j] = r [j]/ x
117
+ l[j] = c [j]/ d
117
118
end
118
119
for j in 1 : min (n- k+ 1 , b+ 1 )
119
120
R[k, j+ k- 1 ] = l[j]
120
121
end
121
- F12 = k == 1 ? T (2 ) : T (1 )
122
- r2 [1 ] = r [2 ]/ F12
122
+ X21 = k == 1 ? T (2 ) : T (1 )
123
+ ĉ [1 ] = c [2 ]/ X21
123
124
for j in 2 : b+ 1
124
- r2 [j] = (r [j+ 1 ]+ r [j- 1 ] + r [1 ]* col1 [j] - col1 [1 ]* r [j])/ F12
125
+ ĉ [j] = (c [j+ 1 ] + c [j- 1 ] + c [1 ]* row1 [j] - row1 [1 ]* c [j])/ X21
125
126
end
126
- r2 [b+ 2 ] = (r [b+ 1 ] + r [1 ]* col1 [b+ 2 ] - col1 [1 ]* r [b+ 2 ])/ F12
127
- cst = r [2 ]/ x
127
+ ĉ [b+ 2 ] = (c [b+ 1 ] + c [1 ]* row1 [b+ 2 ] - row1 [1 ]* c [b+ 2 ])/ X21
128
+ cst = c [2 ]/ d
128
129
for j in 1 : b+ 2
129
- r [j] = r2 [j+ 1 ] - cst* l[j+ 1 ]
130
+ c [j] = ĉ [j+ 1 ] - cst* l[j+ 1 ]
130
131
end
132
+ cst = X21/ d
131
133
for j in 1 : b+ 2
132
- col1 [j] = - F12 / x * l[j+ 1 ]
134
+ row1 [j] = - cst * l[j+ 1 ]
133
135
end
134
136
end
135
137
end
0 commit comments