4242
4343# Outputs
4444# -------
45- function initialize_output(:: typeof (lq_full!), A:: AbstractMatrix , :: LAPACK_HouseholderLQ )
45+ function initialize_output(:: typeof (lq_full!), A:: AbstractMatrix , :: AbstractAlgorithm )
4646 m, n = size(A)
4747 L = similar(A, (m, n))
4848 Q = similar(A, (n, n))
4949 return (L, Q)
5050end
51- function initialize_output(:: typeof (lq_compact!), A:: AbstractMatrix , :: LAPACK_HouseholderLQ )
51+ function initialize_output(:: typeof (lq_compact!), A:: AbstractMatrix , :: AbstractAlgorithm )
5252 m, n = size(A)
5353 minmn = min(m, n)
5454 L = similar(A, (m, minmn))
5555 Q = similar(A, (minmn, n))
5656 return (L, Q)
5757end
58- function initialize_output(:: typeof (lq_null!), A:: AbstractMatrix , :: LAPACK_HouseholderLQ )
58+ function initialize_output(:: typeof (lq_null!), A:: AbstractMatrix , :: AbstractAlgorithm )
5959 m, n = size(A)
6060 minmn = min(m, n)
6161 Nᴴ = similar(A, (n - minmn, n))
@@ -71,17 +71,34 @@ function lq_full!(A::AbstractMatrix, LQ, alg::LAPACK_HouseholderLQ)
7171 _lapack_lq!(A, L, Q; alg. kwargs... )
7272 return L, Q
7373end
74+ function lq_full!(A:: AbstractMatrix , LQ, alg:: LQViaTransposedQR )
75+ check_input(lq_full!, A, LQ)
76+ L, Q = LQ
77+ lq_via_qr!(A, L, Q, alg. qr_alg)
78+ return L, Q
79+ end
7480function lq_compact!(A:: AbstractMatrix , LQ, alg:: LAPACK_HouseholderLQ )
7581 check_input(lq_compact!, A, LQ)
7682 L, Q = LQ
7783 _lapack_lq!(A, L, Q; alg. kwargs... )
7884 return L, Q
7985end
86+ function lq_compact!(A:: AbstractMatrix , LQ, alg:: LQViaTransposedQR )
87+ check_input(lq_compact!, A, LQ)
88+ L, Q = LQ
89+ lq_via_qr!(A, L, Q, alg. qr_alg)
90+ return L, Q
91+ end
8092function lq_null!(A:: AbstractMatrix , Nᴴ, alg:: LAPACK_HouseholderLQ )
8193 check_input(lq_null!, A, Nᴴ)
8294 _lapack_lq_null!(A, Nᴴ; alg. kwargs... )
8395 return Nᴴ
8496end
97+ function lq_null!(A:: AbstractMatrix , Nᴴ, alg:: LQViaTransposedQR )
98+ check_input(lq_null!, A, Nᴴ)
99+ lq_null_via_qr!(A, Nᴴ, alg. qr_alg)
100+ return Nᴴ
101+ end
85102
86103function _lapack_lq!(A:: AbstractMatrix , L:: AbstractMatrix , Q:: AbstractMatrix ;
87104 positive= false ,
@@ -158,3 +175,31 @@ function _lapack_lq_null!(A::AbstractMatrix, Nᴴ::AbstractMatrix;
158175 end
159176 return Nᴴ
160177end
178+
179+ # LQ via transposition and QR
180+ function lq_via_qr!(A:: AbstractMatrix , L:: AbstractMatrix , Q:: AbstractMatrix ,
181+ qr_alg:: AbstractAlgorithm )
182+ m, n = size(A)
183+ minmn = min(m, n)
184+ At = adjoint!(similar(A' ), A)
185+ Qt = (A === Q) ? At : similar(Q' )
186+ Lt = similar(L' )
187+ if size(Q) == (n, n)
188+ Qt, Lt = qr_full!(At, (Qt, Lt), qr_alg)
189+ else
190+ Qt, Lt = qr_compact!(At, (Qt, Lt), qr_alg)
191+ end
192+ adjoint!(Q, Qt)
193+ !isempty(L) && adjoint!(L, Lt)
194+ return L, Q
195+ end
196+
197+ function lq_null_via_qr!(A::AbstractMatrix, N::AbstractMatrix, qr_alg::AbstractAlgorithm)
198+ m, n = size(A)
199+ minmn = min(m, n)
200+ At = adjoint!(similar(A' ), A)
201+ Nt = similar(N' )
202+ Nt = qr_null!(At, Nt, qr_alg)
203+ !isempty(N) && adjoint!(N, Nt)
204+ return N
205+ end
0 commit comments