Skip to content

Commit 1379f1c

Browse files
committed
Move ::QR solving logic out of _solve_general
1 parent 2b35006 commit 1379f1c

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/solve.jl

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
@inline (\)(a::StaticMatrix, b::StaticVecOrMat) = _solve(Size(a), Size(b), a, b)
2-
@inline (\)(Q::QR, b::StaticVecOrMat) = Q.R \ (Q.Q' * b)
2+
@inline (\)(q::QR, b::StaticVecOrMat) = _solve(Size(q.Q), Size(q.R), q, b)
3+
@inline function _solve(::Size{Sq}, ::Size{Sr}, q::QR, b::StaticVecOrMat) where {Sq, Sr}
4+
Sa = (Sq[1], Sr[2]) # Size of the original matrix: Q * R
5+
Q, R = q.Q, q.R
6+
if Sa[1] == Sa[2]
7+
return R \ (Q' * b)
8+
elseif Sa[1] > Sa[2]
9+
y = Q' * b
10+
R₁ = @view R[SOneTo(Sa[2]), SOneTo(Sa[2])]
11+
return R₁ \ y
12+
else
13+
y = Q' * b
14+
return R' * ((R * R') \ y)
15+
end
16+
end
317

418
@inline function _solve(::Size{(1,1)}, ::Size{(1,)}, a::StaticMatrix{<:Any, <:Any, Ta}, b::StaticVector{<:Any, Tb}) where {Ta, Tb}
519
@inbounds return similar_type(b, typeof(a[1] \ b[1]))(a[1] \ b[1])
@@ -68,13 +82,7 @@ end
6882
quote
6983
@_inline_meta
7084
q = qr(a)
71-
y = q.Q' * b
72-
if Sa[1] > Sa[2]
73-
R₁ = SMatrix{Sa[2], Sa[2]}(q.R[SOneTo(Sa[2]), SOneTo(Sa[2])])
74-
R₁ \ y
75-
else
76-
q.R' * ((q.R * q.R') \ y)
77-
end
85+
q \ b
7886
end
7987
end
8088
else

0 commit comments

Comments
 (0)