@@ -102,6 +102,65 @@ function lu!(A::HermOrSym{T}, pivot::Union{RowMaximum,NoPivot,RowNonZero} = lupi
102102 end
103103 lu! (A. data, pivot; check, allowsingular)
104104end
105+
106+ # lu!(F::LU,A) should be dispatched on the type of matrix stored in the LU factorization.
107+ """
108+ lu!(F::LU, pivot = RowMaximum(); check = true, allowsingular = false) -> LU
109+
110+ `lu!` is the same as [`lu`](@ref), but saves space by overwriting the
111+ input `F`, instead of creating a copy.
112+
113+ !!! compat "Julia 1.12"
114+ Reusing dense `LU` factorizations in `lu!` require Julia 1.12 or later.
115+
116+ # Examples
117+ ```jldoctest
118+ julia> A = [4. 3.; 6. 3.]
119+ 2×2 Matrix{Float64}:
120+ 4.0 3.0
121+ 6.0 3.0
122+
123+ julia> F = lu(A)
124+ LU{Float64, Matrix{Float64}, Vector{Int64}}
125+ L factor:
126+ 2×2 Matrix{Float64}:
127+ 1.0 0.0
128+ 0.666667 1.0
129+ U factor:
130+ 2×2 Matrix{Float64}:
131+ 6.0 3.0
132+ 0.0 1.0
133+
134+ julia> B = [8 3; 12 3]
135+ 2×2 Matrix{Int64}:
136+ 8 3
137+ 12 3
138+
139+ julia> F2 = lu!(F,B)
140+ LU{Float64, Matrix{Float64}, Vector{Int64}}
141+ L factor:
142+ 2×2 Matrix{Float64}:
143+ 1.0 0.0
144+ 0.666667 1.0
145+ U factor:
146+ 2×2 Matrix{Float64}:
147+ 12.0 3.0
148+ 0.0 1.0
149+ ```
150+ """
151+ function lu! (F:: LU{<:Any,<:AbstractMatrix} , A; check:: Bool = true , allowsingular:: Bool = false )
152+ copyto! (F. factors, A)
153+ return generic_lufact! (F. factors, lupivottype (eltype (A)), F. ipiv; check, allowsingular)
154+ end
155+
156+ # lu!(F::LU,A) should be dispatched on the type of matrix stored in the LU factorization.
157+ function lu! (F:: LU{<:Any,<:StridedMatrix{<:BlasFloat}} , A; check:: Bool = true , allowsingular:: Bool = false )
158+ copyto! (F. factors, A)
159+ lpt = LAPACK. getrf! (F. factors, F. ipiv; check)
160+ check && _check_lu_success (lpt[3 ], allowsingular)
161+ return LU {eltype(lpt[1]),typeof(lpt[1]),typeof(lpt[2])} (lpt[1 ], lpt[2 ], lpt[3 ])
162+ end
163+
105164# for backward compatibility
106165# TODO : remove towards Julia v2
107166@deprecate lu! (A:: Union{StridedMatrix,HermOrSym,Tridiagonal} , :: Val{true} ; check:: Bool = true ) lu! (A, RowMaximum (); check= check)
@@ -149,7 +208,7 @@ Stacktrace:
149208"""
150209lu! (A:: AbstractMatrix , pivot:: Union{RowMaximum,NoPivot,RowNonZero} = lupivottype (eltype (A));
151210 check:: Bool = true , allowsingular:: Bool = false ) = generic_lufact! (A, pivot; check, allowsingular)
152- function generic_lufact! (A:: AbstractMatrix{T} , pivot:: Union{RowMaximum,NoPivot,RowNonZero} = lupivottype (T);
211+ function generic_lufact! (A:: AbstractMatrix{T} , pivot:: Union{RowMaximum,NoPivot,RowNonZero} = lupivottype (T), ipiv :: AbstractVector{BlasInt} = Vector {BlasInt} (undef, min ( size (A) ... )) ;
153212 check:: Bool = true , allowsingular:: Bool = false ) where {T}
154213 check && LAPACK. chkfinite (A)
155214 # Extract values
@@ -158,7 +217,6 @@ function generic_lufact!(A::AbstractMatrix{T}, pivot::Union{RowMaximum,NoPivot,R
158217
159218 # Initialize variables
160219 info = 0
161- ipiv = Vector {BlasInt} (undef, minmn)
162220 @inbounds begin
163221 for k = 1 : minmn
164222 # find index max
0 commit comments