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