Skip to content

Commit 17f3e59

Browse files
add modified chebyshev generic routine
rename variables in STpH
1 parent da3e865 commit 17f3e59

File tree

3 files changed

+51
-36
lines changed

3 files changed

+51
-36
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "FastTransforms"
22
uuid = "057dd010-8810-581a-b7be-e3fc3b93f78c"
3-
version = "0.16.1"
3+
version = "0.16.2"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"

src/SymmetricToeplitzPlusHankel.jl

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ end
3737
bandwidths(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
#
4343
function 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)
6666
end
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])
9899
end
99100

100101
function 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)
110111
end
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
135137
end

src/libfasttransforms.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,3 +1250,16 @@ for (fC, T) in ((:execute_jacobi_similarityf, Float32), (:execute_jacobi_similar
12501250
end
12511251
end
12521252
end
1253+
1254+
function modified_jacobi_matrix(R, XP)
1255+
n = size(R, 1) - 1
1256+
XQ = SymTridiagonal(zeros(n), zeros(n-1))
1257+
XQ.dv[1] = (R[1, 1]*XP[1, 1] + R[1, 2]*XP[2, 1])/R[1, 1]
1258+
for i in 1:n-1
1259+
XQ.ev[i] = R[i+1, i+1]*XP[i+1, i]/R[i, i]
1260+
end
1261+
for i in 2:n
1262+
XQ.dv[i] = (R[i, i]*XP[i,i] + R[i, i+1]*XP[i+1, i] - XQ[i, i-1]*R[i-1, i])/R[i, i]
1263+
end
1264+
return XQ
1265+
end

0 commit comments

Comments
 (0)