3737bandwidths (A:: SymmetricBandedToeplitzPlusHankel{T} ) where T = (A. b, A. b)
3838
3939#
40- # Jac* W-W*Jac' = G*J*G'
40+ # X' W-W*X = G*J*G'
4141# This returns G and J, where J = [0 I; -I 0], respecting the skew-symmetry of the right-hand side.
4242#
4343function compute_skew_generators (A:: SymmetricToeplitzPlusHankel{T} ) where T
@@ -56,80 +56,82 @@ function cholesky(A::SymmetricToeplitzPlusHankel{T}) where T
5656 n = size (A, 1 )
5757 G, J = compute_skew_generators (A)
5858 L = zeros (T, n, n)
59- r = A[:, 1 ]
60- r2 = zeros (T, n)
59+ c = A[:, 1 ]
60+ ĉ = zeros (T, n)
6161 l = zeros (T, n)
6262 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)
6565 return Cholesky (L, ' L' , 0 )
6666end
6767
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
6969 @inbounds @simd for k in 1 : n- 1
70- x = sqrt (r [1 ])
70+ d = sqrt (c [1 ])
7171 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
7373 end
7474 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 ]
7676 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
7979 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
8181 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
8484 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 ]
8686 end
87+ cst = X21/ d
8788 for j in 1 : n- k
88- col1 [j] = - F12 / x * l[j+ 1 ]
89+ row1 [j] = - cst * l[j+ 1 ]
8990 end
90- c1 = G[1 , 1 ]
91- c2 = G[1 , 2 ]
91+ gd1 = G[1 , 1 ]/ d
92+ gd2 = G[1 , 2 ]/ d
9293 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
9596 end
9697 end
97- L[n, n] = sqrt (r [1 ])
98+ L[n, n] = sqrt (c [1 ])
9899end
99100
100101function cholesky (A:: SymmetricBandedToeplitzPlusHankel{T} ) where T
101102 n = size (A, 1 )
102103 b = A. b
103104 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 )
106107 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)
109110 return Cholesky (R, ' U' , 0 )
110111end
111112
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
113114 @inbounds @simd for k in 1 : n
114- x = sqrt (r [1 ])
115+ d = sqrt (c [1 ])
115116 for j in 1 : b+ 1
116- l[j] = r [j]/ x
117+ l[j] = c [j]/ d
117118 end
118119 for j in 1 : min (n- k+ 1 , b+ 1 )
119120 R[k, j+ k- 1 ] = l[j]
120121 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
123124 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
125126 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
128129 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 ]
130131 end
132+ cst = X21/ d
131133 for j in 1 : b+ 2
132- col1 [j] = - F12 / x * l[j+ 1 ]
134+ row1 [j] = - cst * l[j+ 1 ]
133135 end
134136 end
135137end
0 commit comments