|
1 | 1 | module MatrixAlgebraKitGenericLinearAlgebraExt |
2 | 2 |
|
3 | 3 | using MatrixAlgebraKit |
4 | | -using MatrixAlgebraKit: sign_safe, check_input, diagview, gaugefix!, default_fixgauge |
| 4 | +using MatrixAlgebraKit: sign_safe, check_input, diagview, gaugefix!, one!, default_fixgauge |
5 | 5 | using GenericLinearAlgebra: svd!, svdvals!, eigen!, eigvals!, Hermitian, qr! |
6 | 6 | using LinearAlgebra: I, Diagonal, lmul! |
7 | 7 |
|
@@ -72,6 +72,11 @@ function MatrixAlgebraKit.qr_compact!(A::AbstractMatrix, QR, alg::GLA_Householde |
72 | 72 | return _gla_householder_qr!(A, Q, R; alg.kwargs...) |
73 | 73 | end |
74 | 74 |
|
| 75 | +function MatrixAlgebraKit.qr_null!(A::AbstractMatrix, N, alg::GLA_HouseholderQR) |
| 76 | + check_input(qr_null!, A, N, alg) |
| 77 | + return _gla_householder_qr_null!(A, N; alg.kwargs...) |
| 78 | +end |
| 79 | + |
75 | 80 | function _gla_householder_qr!(A::AbstractMatrix, Q, R; positive = false, blocksize = 1, pivoted = false) |
76 | 81 | pivoted && throw(ArgumentError("Only pivoted = false implemented for GLA_HouseholderQR.")) |
77 | 82 | (blocksize == 1) || throw(ArgumentError("Only blocksize = 1 implemented for GLA_HouseholderQR.")) |
@@ -109,6 +114,21 @@ function _gla_householder_qr!(A::AbstractMatrix, Q, R; positive = false, blocksi |
109 | 114 | return Q, R |
110 | 115 | end |
111 | 116 |
|
| 117 | +function _gla_householder_qr_null!( |
| 118 | + A::AbstractMatrix, N::AbstractMatrix; |
| 119 | + positive = false, blocksize = 1, pivoted = false |
| 120 | + ) |
| 121 | + pivoted && throw(ArgumentError("Only pivoted = false implemented for GLA_HouseholderQR.")) |
| 122 | + (blocksize == 1) || throw(ArgumentError("Only blocksize = 1 implemented for GLA_HouseholderQR.")) |
| 123 | + m, n = size(A) |
| 124 | + minmn = min(m, n) |
| 125 | + fill!(N, zero(eltype(N))) |
| 126 | + one!(view(N, (minmn + 1):m, 1:(m - minmn))) |
| 127 | + Q̃, = qr!(A) |
| 128 | + lmul!(Q̃, N) |
| 129 | + return N |
| 130 | +end |
| 131 | + |
112 | 132 | function MatrixAlgebraKit.default_lq_algorithm(::Type{T}; kwargs...) where {T <: StridedMatrix{<:Union{Float16, ComplexF16, BigFloat, Complex{BigFloat}}}} |
113 | 133 | return MatrixAlgebraKit.LQViaTransposedQR(GLA_HouseholderQR(; kwargs...)) |
114 | 134 | end |
|
0 commit comments