Skip to content

Commit 3ccd11c

Browse files
committed
Fix dispatch for rdiv! with LU (#55764)
1 parent bf5675b commit 3ccd11c

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

stdlib/LinearAlgebra/src/lu.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ function ldiv!(adjA::AdjointFactorization{<:Any,<:LU{T,Tridiagonal{T,V}}}, B::Ab
786786
return B
787787
end
788788

789-
rdiv!(B::AbstractMatrix, A::LU) = transpose(ldiv!(transpose(A), transpose(B)))
789+
rdiv!(B::AbstractMatrix, A::LU{T,Tridiagonal{T,V}}) where {T,V} = transpose(ldiv!(transpose(A), transpose(B)))
790790

791791
# Conversions
792792
AbstractMatrix(F::LU) = (F.L * F.U)[invperm(F.p),:]

stdlib/LinearAlgebra/src/triangular.jl

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -919,9 +919,20 @@ _trimul!(C::AbstractMatrix, A::UpperOrLowerTriangular, B::AbstractTriangular) =
919919
_trimul!(C::AbstractMatrix, A::AbstractTriangular, B::UpperOrLowerTriangular) =
920920
generic_mattrimul!(C, uplo_char(B), isunit_char(B), wrapperop(parent(B)), A, _unwrap_at(parent(B)))
921921

922-
lmul!(A::AbstractTriangular, B::AbstractVecOrMat) = @inline _trimul!(B, A, B)
923-
rmul!(A::AbstractMatrix, B::AbstractTriangular) = @inline _trimul!(A, A, B)
924-
922+
function lmul!(A::AbstractTriangular, B::AbstractVecOrMat)
923+
if istriu(A)
924+
_trimul!(B, uppertriangular(A), B)
925+
else
926+
_trimul!(B, lowertriangular(A), B)
927+
end
928+
end
929+
function rmul!(A::AbstractMatrix, B::AbstractTriangular)
930+
if istriu(B)
931+
_trimul!(A, A, uppertriangular(B))
932+
else
933+
_trimul!(A, A, lowertriangular(B))
934+
end
935+
end
925936

926937
for TC in (:AbstractVector, :AbstractMatrix)
927938
@eval @inline function _mul!(C::$TC, A::AbstractTriangular, B::AbstractVector, alpha::Number, beta::Number)
@@ -957,8 +968,20 @@ _ldiv!(C::AbstractVecOrMat, A::UpperOrLowerTriangular, B::AbstractVecOrMat) =
957968
_rdiv!(C::AbstractMatrix, A::AbstractMatrix, B::UpperOrLowerTriangular) =
958969
generic_mattridiv!(C, uplo_char(B), isunit_char(B), wrapperop(parent(B)), A, _unwrap_at(parent(B)))
959970

960-
ldiv!(A::AbstractTriangular, B::AbstractVecOrMat) = @inline _ldiv!(B, A, B)
961-
rdiv!(A::AbstractMatrix, B::AbstractTriangular) = @inline _rdiv!(A, A, B)
971+
function ldiv!(A::AbstractTriangular, B::AbstractVecOrMat)
972+
if istriu(A)
973+
_ldiv!(B, uppertriangular(A), B)
974+
else
975+
_ldiv!(B, lowertriangular(A), B)
976+
end
977+
end
978+
function rdiv!(A::AbstractMatrix, B::AbstractTriangular)
979+
if istriu(B)
980+
_rdiv!(A, A, uppertriangular(B))
981+
else
982+
_rdiv!(A, A, lowertriangular(B))
983+
end
984+
end
962985

963986
# preserve triangular structure in in-place multiplication/division
964987
for (cty, aty, bty) in ((:UpperTriangular, :UpperTriangular, :UpperTriangular),

0 commit comments

Comments
 (0)