Skip to content

Commit 21811a7

Browse files
committed
Support bidiagonal
1 parent 9b4e57d commit 21811a7

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

src/banded/tridiagonalconjugation.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function upper_mul_tri_triview!(UX::Tridiagonal, U::BandedMatrix, X::Tridiagonal
1818
l,u = bandwidths(U)
1919

2020
@assert size(U) == (n,n)
21-
@assert l == 0 && u 2
21+
@assert l 0
2222
# Tridiagonal bands can be resized
2323
@assert length(Xdl)+1 == length(Xd) == length(Xdu)+1 == length(UXdl)+1 == length(UXd) == length(UXdu)+1 == n
2424

@@ -42,7 +42,7 @@ function initiate_upper_mul_tri_triview!(UX, U::BandedMatrix, X)
4242

4343
k = 1
4444
aₖ, cₖ = Xd[1], Xdl[1]
45-
Uₖₖ, Uₖₖ₊₁, Uₖₖ₊₂ = Udat[u+1,1], Udat[u,2], Udat[u-1,3] # U[k,k], U[k,k+1], U[k,k+2]
45+
Uₖₖ, Uₖₖ₊₁, Uₖₖ₊₂ = Udat[u+1,1], Udat[u,2], (u > 1 ? Udat[u-1,3] : zero(eltype(Udat))) # U[k,k], U[k,k+1], U[k,k+2]
4646
UXd[1] = Uₖₖ*aₖ + Uₖₖ₊₁*cₖ # UX[k,k] = U[k,k]*X[k,k] + U[k,k+1]*X[k+1,k]
4747
bₖ, aₖ, cₖ, cₖ₋₁ = Xdu[1], Xd[2], Xdl[2], cₖ # X[k,k+1], X[k+1,k+1], X[k+2,k+1], X[k+1,k]
4848
UXdu[1] = Uₖₖ*bₖ + Uₖₖ₊₁*aₖ + Uₖₖ₊₂*cₖ # UX[k,k+1] = U[k,k]*X[k,k+1] + U[k,k+1]*X[k+1,k+1] + U[k,k+1]*X[k+1,k]
@@ -71,7 +71,7 @@ function main_upper_mul_tri_triview!(UX, U::BandedMatrix, X, kr, bₖ=X[kr[1]-1,
7171
l,u = bandwidths(U)
7272

7373
for k = kr
74-
Uₖₖ, Uₖₖ₊₁, Uₖₖ₊₂ = Udat[u+1,k], Udat[u,k+1], Udat[u-1,k+2] # U[k,k], U[k,k+1], U[k,k+2]
74+
Uₖₖ, Uₖₖ₊₁, Uₖₖ₊₂ = Udat[u+1,k], Udat[u,k+1], (u > 1 ? Udat[u-1,k+2] : zero(eltype(Udat))) # U[k,k], U[k,k+1], U[k,k+2]
7575
UXdl[k-1] = Uₖₖ*cₖ₋₁ # UX[k,k-1] = U[k,k]*X[k,k-1]
7676
UXd[k] = Uₖₖ*aₖ + Uₖₖ₊₁*cₖ # UX[k,k] = U[k,k]*X[k,k] + U[k,k+1]*X[k+1,k]
7777
bₖ, aₖ, cₖ, cₖ₋₁ = Xdu[k], Xd[k+1], Xdl[k+1], cₖ # X[k,k+1], X[k+1,k+1], X[k+2,k+1], X[k+1,k]
@@ -118,7 +118,7 @@ function tri_mul_invupper_triview!(Y::Tridiagonal, X::Tridiagonal, R::BandedMatr
118118
l,u = bandwidths(R)
119119

120120
@assert size(R) == (n,n)
121-
@assert l == 0 && u 2
121+
@assert l 0 && u 1
122122
# Tridiagonal bands can be resized
123123
@assert length(Xdl)+1 == length(Xd) == length(Xdu)+1 == length(Ydl)+1 == length(Yd) == length(Ydu)+1 == n
124124

@@ -177,12 +177,12 @@ function main_tri_mul_invupper_triview!(Y::Tridiagonal, X::Tridiagonal, R::Bande
177177
Rdat = R.data
178178
l,u = bandwidths(R)
179179

180-
@inbounds for k = kr
180+
for k = kr
181181
cₖ₋₁,aₖ,bₖ = Xdl[k-1], Xd[k], Xdu[k]
182182
Ydl[k-1] = cₖ₋₁/Rₖₖ
183183
Yd[k] = aₖ-cₖ₋₁*Rₖₖ₊₁/Rₖₖ
184184
Ydu[k] = cₖ₋₁/Rₖₖ
185-
Rₖₖ,Rₖₖ₊₁,Rₖ₋₁ₖ₊₁,Rₖ₋₁ₖ = Rdat[u+1,k], Rdat[u,k+1],Rdat[u-1,k+1],Rₖₖ₊₁ # R[k,k], R[k,k+1], R[k-1,k]
185+
Rₖₖ,Rₖₖ₊₁,Rₖ₋₁ₖ₊₁,Rₖ₋₁ₖ = Rdat[u+1,k], Rdat[u,k+1],(u > 1 ? Rdat[u-1,k+1] : zero(eltype(Rdat))),Rₖₖ₊₁ # R[k,k], R[k,k+1], R[k-1,k+1]
186186
Yd[k] /= Rₖₖ
187187
Ydu[k-1] /= Rₖₖ
188188
Ydu[k] *= Rₖ₋₁ₖ*Rₖₖ₊₁/Rₖₖ - Rₖ₋₁ₖ₊₁

test/test_bidiagonalconjugation.jl

+6-2
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,18 @@ end
117117
(-(0:∞) ./ (2:2:∞))',
118118
((2:∞) ./ (2:2:∞))'), ℵ₀, 0,2),
119119
LazyBandedMatrices.Tridiagonal((2:∞) ./ (3:2:∞), -1 ./ ((1:2:∞) .* (3:2:∞)), (1:∞) ./ (3:2:∞))),
120+
(_BandedMatrix(Vcat(
121+
(-(0:∞) ./ (2:2:∞))',
122+
((2:∞) ./ (2:2:∞))'), ℵ₀, 0,1),
123+
LazyBandedMatrices.Tridiagonal((2:∞) ./ (3:2:∞), -1 ./ ((1:2:∞) .* (3:2:∞)), (1:∞) ./ (3:2:∞)))
120124
# P -> C^(5/2)
121125
(_BandedMatrix(Vcat((-3 ./ (3:2:∞))', Zeros(1,∞), (3 ./ (3:2:∞))'), ℵ₀, 0,2) *
122126
_BandedMatrix(Vcat((-1 ./ (1:2:∞))', Zeros(1,∞), (1 ./ (1:2:∞))'), ℵ₀, 0,2),
123127
LazyBandedMatrices.Tridiagonal((1:∞) ./ (1:2:∞), Zeros(∞), (1:∞) ./ (3:2:∞)))
124128
)
125129
n = 1000
126-
@time U = V = R[1:n,1:n];
127-
@time X = Tridiagonal(Vector(X_T.dl[1:n-1]), Vector(X_T.d[1:n]), Vector(X_T.du[1:n-1]));
130+
@time U = V = R[1:n,1:n]
131+
@time X = Tridiagonal(Vector(X_T.dl[1:n-1]), Vector(X_T.d[1:n]), Vector(X_T.du[1:n-1]))
128132
@time UX = InfiniteLinearAlgebra.upper_mul_tri_triview(U, X)
129133
@test Tridiagonal(U*X) UX
130134
# U*X*inv(U) only depends on Tridiagonal(U*X)

0 commit comments

Comments
 (0)