Skip to content

Commit 6324922

Browse files
committed
Q'b for adaptive QR
1 parent ce154a7 commit 6324922

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

src/infql.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,10 @@ function lmul!(A::QLPackedQ{<:Any,<:InfBandedMatrix}, B::AbstractVecOrMat)
128128
for j = 1:nB
129129
vBj = B[k,j]
130130
for i = max(1-u):k-1
131-
if !iszero(B[i,j])
131+
Bij = B[i,j]
132+
if !iszero(Bij)
132133
allzero = false
133-
vBj += conj(D[i-ν+u+1,ν])*B[i,j]
134+
vBj += conj(D[i-ν+u+1,ν])*Bij
134135
end
135136
end
136137
vBj = A.τ[k]*vBj

src/infqr.jl

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ function qr(A::BandedMatrix{<:Any,<:Any,<:OneToInf})
8383
QR(AdaptiveQRFactors(data), AdaptiveQRTau(data))
8484
end
8585

86+
#########
87+
# lmul!
88+
#########
89+
8690

8791
function lmul!(A::QRPackedQ{<:Any,<:AdaptiveQRFactors}, B::CachedVector{T,Vector{T},<:Zeros{T,1}}) where T
8892
require_one_based_indexing(B)
@@ -114,4 +118,38 @@ function lmul!(A::QRPackedQ{<:Any,<:AdaptiveQRFactors}, B::CachedVector{T,Vector
114118
end
115119
end
116120
B
121+
end
122+
123+
124+
function lmul!(adjA::Adjoint{<:Any,<:QRPackedQ{<:Any,<:AdaptiveQRFactors}}, B::CachedVector{T,Vector{T},<:Zeros{T,1}}) where T
125+
require_one_based_indexing(B)
126+
A = adjA.parent
127+
mA, nA = size(A.factors)
128+
mB = length(B)
129+
if mA != mB
130+
throw(DimensionMismatch("matrix A has dimensions ($mA,$nA) but B has dimensions ($mB, $nB)"))
131+
end
132+
Afactors = A.factors
133+
sB = length(B.data)
134+
@inbounds begin
135+
for k = 1:min(mA,nA)
136+
vBj = B[k]
137+
allzero = k > sB ? iszero(vBj) : false
138+
cs = colsupport(Afactors,k)
139+
for i = (k+1:mB) cs
140+
Bi = B[i]
141+
if !iszero(Bi)
142+
allzero = false
143+
vBj += conj(Afactors[i,k])*Bi
144+
end
145+
end
146+
vBj = conj(A.τ[k])*vBj
147+
B[k] -= vBj
148+
for i = (k+1:mB) cs
149+
B[i] -= Afactors[i,k]*vBj
150+
end
151+
allzero && break
152+
end
153+
end
154+
B
117155
end

test/test_infqr.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout
6767
@test Q[200_000,200_000] -1.0
6868
@test Q[1:101,1:100] qr(A[1:101,1:100]).Q[:,1:100]
6969

70-
# lmul!(Q', Base.copymutable(b))
70+
r = lmul!(Q', Base.copymutable(b))
71+
nr = length(r.data)
72+
@test qr(A[1:nr+1,1:nr]).Q'b[1:nr+1] r[1:nr+1]
73+
74+
materialize!(Ldiv(R, r))
7175
end
7276
end
7377

0 commit comments

Comments
 (0)