Skip to content

Commit 341d84c

Browse files
antoine-levittdkarrasch
authored andcommitted
Add some three-argument ldiv! methods (#33806)
1 parent 7176f1a commit 341d84c

File tree

7 files changed

+17
-10
lines changed

7 files changed

+17
-10
lines changed

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ function ldiv!(D::Diagonal{T}, V::AbstractMatrix{T}) where {T}
427427
end
428428
V
429429
end
430-
430+
ldiv!(x::AbstractArray, A::Diagonal, b::AbstractArray) = (x .= A.diag .\ b)
431431

432432
ldiv!(adjD::Adjoint{<:Any,<:Diagonal{T}}, B::AbstractVecOrMat{T}) where {T} =
433433
(D = adjD.parent; ldiv!(conj(D), B))

stdlib/LinearAlgebra/src/factorization.jl

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,6 @@ function ldiv!(Y::AbstractVecOrMat, A::Factorization, B::AbstractVecOrMat)
140140
end
141141
end
142142

143-
function ldiv!(Y::AbstractVecOrMat, adjA::Adjoint{<:Any,<:Factorization}, B::AbstractVecOrMat)
144-
checksquare(adjA)
145-
return ldiv!(adjA, copyto!(Y, B))
146-
end
147-
function ldiv!(Y::AbstractVecOrMat, transA::Transpose{<:Any,<:Factorization}, B::AbstractVecOrMat)
148-
checksquare(transA)
149-
return ldiv!(transA, copyto!(Y, B))
150-
end
151-
152143
# fallback methods for transposed solves
153144
\(F::Transpose{<:Any,<:Factorization{<:Real}}, B::AbstractVecOrMat) = adjoint(F.parent) \ B
154145
\(F::Transpose{<:Any,<:Factorization}, B::AbstractVecOrMat) = conj.(adjoint(F.parent) \ conj.(B))

stdlib/LinearAlgebra/src/generic.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ function ldiv!(s::Number, X::AbstractArray)
241241
end
242242
X
243243
end
244+
ldiv!(Y::AbstractArray, s::Number, X::AbstractArray) = Y .= s .\ X
245+
246+
# Generic fallback. This assumes that B and Y have the same sizes.
247+
ldiv!(Y::AbstractArray, A::AbstractMatrix, B::AbstractArray) = ldiv!(A, copyto!(Y, B))
248+
244249

245250
"""
246251
cross(x, y)

stdlib/LinearAlgebra/src/uniformscaling.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ rmul!(A::AbstractMatrix, J::UniformScaling) = rmul!(A, J.λ)
222222
lmul!(J::UniformScaling, B::AbstractVecOrMat) = lmul!(J.λ, B)
223223
rdiv!(A::AbstractMatrix, J::UniformScaling) = rdiv!(A, J.λ)
224224
ldiv!(J::UniformScaling, B::AbstractVecOrMat) = ldiv!(J.λ, B)
225+
ldiv!(Y::AbstractVecOrMat, J::UniformScaling, B::AbstractVecOrMat) = (Y .= J.λ .\ B)
225226

226227
Broadcast.broadcasted(::typeof(*), x::Number,J::UniformScaling) = UniformScaling(x*J.λ)
227228
Broadcast.broadcasted(::typeof(*), J::UniformScaling,x::Number) = UniformScaling(J.λ*x)

stdlib/LinearAlgebra/test/diagonal.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ Random.seed!(1)
115115
@test ldiv!(D, copy(U)) DM\U atol=atol_three
116116
@test ldiv!(transpose(D), copy(U)) DM\U atol=atol_three
117117
@test ldiv!(adjoint(conj(D)), copy(U)) DM\U atol=atol_three
118+
119+
@test ldiv!(zero(v), D, copy(v)) DM\v atol=atol_two
120+
@test ldiv!(zero(v), transpose(D), copy(v)) DM\v atol=atol_two
121+
@test ldiv!(zero(v), adjoint(conj(D)), copy(v)) DM\v atol=atol_two
122+
@test ldiv!(zero(U), D, copy(U)) DM\U atol=atol_three
123+
@test ldiv!(zero(U), transpose(D), copy(U)) DM\U atol=atol_three
124+
@test ldiv!(zero(U), adjoint(conj(D)), copy(U)) DM\U atol=atol_three
125+
118126
Uc = copy(U')
119127
target = rmul!(Uc, Diagonal(inv.(D.diag)))
120128
@test rdiv!(Uc, D) target atol=atol_three

stdlib/LinearAlgebra/test/generic.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ end
119119
@testset "Scaling with rdiv! and ldiv!" begin
120120
@test rdiv!(copy(a), 5.) == a/5
121121
@test ldiv!(5., copy(a)) == a/5
122+
@test ldiv!(zero(a), 5., copy(a)) == a/5
122123
end
123124

124125
@testset "Scaling with 3-argument mul!" begin

stdlib/LinearAlgebra/test/uniformscaling.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ end
326326
@test lmul!(J, copyto!(C, A)) == target_mul
327327
@test rmul!(copyto!(C, A), J) == target_mul
328328
@test ldiv!(J, copyto!(C, A)) == target_div
329+
@test ldiv!(C, J, A) == target_div
329330
@test rdiv!(copyto!(C, A), J) == target_div
330331

331332
A = randn(4, 3)

0 commit comments

Comments
 (0)