@@ -332,6 +332,28 @@ function (*)(D::Diagonal, V::AbstractVector)
332332 return D. diag .* V
333333end
334334
335+ function _diag_adj_mul (A:: AdjOrTransAbsMat , D:: Diagonal )
336+ adj = wrapperop (A)
337+ copy (adj (adj (D) * adj (A)))
338+ end
339+ function _diag_adj_mul (A:: AdjOrTransAbsMat{<:Number, <:StridedMatrix} , D:: Diagonal{<:Number} )
340+ @invoke * (A:: AbstractMatrix , D:: AbstractMatrix )
341+ end
342+ function _diag_adj_mul (D:: Diagonal , A:: AdjOrTransAbsMat )
343+ adj = wrapperop (A)
344+ copy (adj (adj (A) * adj (D)))
345+ end
346+ function _diag_adj_mul (D:: Diagonal{<:Number} , A:: AdjOrTransAbsMat{<:Number, <:StridedMatrix} )
347+ @invoke * (D:: AbstractMatrix , A:: AbstractMatrix )
348+ end
349+
350+ function (* )(A:: AdjOrTransAbsMat , D:: Diagonal )
351+ _diag_adj_mul (A, D)
352+ end
353+ function (* )(D:: Diagonal , A:: AdjOrTransAbsMat )
354+ _diag_adj_mul (D, A)
355+ end
356+
335357function rmul! (A:: AbstractMatrix , D:: Diagonal )
336358 matmul_size_check (size (A), size (D))
337359 for I in CartesianIndices (A)
@@ -671,22 +693,24 @@ end
671693for Tri in (:UpperTriangular , :LowerTriangular )
672694 UTri = Symbol (:Unit , Tri)
673695 # 2 args
674- for (fun, f) in zip ((:* , :rmul! , :rdiv! , :/ ), (:identity , :identity , :inv , :inv ))
675- @eval $ fun (A:: $Tri , D:: Diagonal ) = $ Tri ($ fun (A. data, D))
676- @eval $ fun (A:: $UTri , D:: Diagonal ) = $ Tri (_setdiag! ($ fun (A. data, D), $ f, D. diag))
696+ for (fun, f) in zip ((:mul , :rmul! , :rdiv! , :/ ), (:identity , :identity , :inv , :inv ))
697+ g = fun == :mul ? :* : fun
698+ @eval $ fun (A:: $Tri , D:: Diagonal ) = $ Tri ($ g (A. data, D))
699+ @eval $ fun (A:: $UTri , D:: Diagonal ) = $ Tri (_setdiag! ($ g (A. data, D), $ f, D. diag))
677700 end
678- @eval * (A:: $Tri{<:Any, <:StridedMaybeAdjOrTransMat} , D:: Diagonal ) =
679- @invoke * (A:: AbstractMatrix , D:: Diagonal )
680- @eval * (A:: $UTri{<:Any, <:StridedMaybeAdjOrTransMat} , D:: Diagonal ) =
681- @invoke * (A:: AbstractMatrix , D:: Diagonal )
682- for (fun, f) in zip ((:* , :lmul! , :ldiv! , :\ ), (:identity , :identity , :inv , :inv ))
683- @eval $ fun (D:: Diagonal , A:: $Tri ) = $ Tri ($ fun (D, A. data))
684- @eval $ fun (D:: Diagonal , A:: $UTri ) = $ Tri (_setdiag! ($ fun (D, A. data), $ f, D. diag))
701+ @eval mul (A:: $Tri{<:Any, <:StridedMaybeAdjOrTransMat} , D:: Diagonal ) =
702+ @invoke mul (A:: AbstractMatrix , D:: Diagonal )
703+ @eval mul (A:: $UTri{<:Any, <:StridedMaybeAdjOrTransMat} , D:: Diagonal ) =
704+ @invoke mul (A:: AbstractMatrix , D:: Diagonal )
705+ for (fun, f) in zip ((:mul , :lmul! , :ldiv! , :\ ), (:identity , :identity , :inv , :inv ))
706+ g = fun == :mul ? :* : fun
707+ @eval $ fun (D:: Diagonal , A:: $Tri ) = $ Tri ($ g (D, A. data))
708+ @eval $ fun (D:: Diagonal , A:: $UTri ) = $ Tri (_setdiag! ($ g (D, A. data), $ f, D. diag))
685709 end
686- @eval * (D:: Diagonal , A:: $Tri{<:Any, <:StridedMaybeAdjOrTransMat} ) =
687- @invoke * (D:: Diagonal , A:: AbstractMatrix )
688- @eval * (D:: Diagonal , A:: $UTri{<:Any, <:StridedMaybeAdjOrTransMat} ) =
689- @invoke * (D:: Diagonal , A:: AbstractMatrix )
710+ @eval mul (D:: Diagonal , A:: $Tri{<:Any, <:StridedMaybeAdjOrTransMat} ) =
711+ @invoke mul (D:: Diagonal , A:: AbstractMatrix )
712+ @eval mul (D:: Diagonal , A:: $UTri{<:Any, <:StridedMaybeAdjOrTransMat} ) =
713+ @invoke mul (D:: Diagonal , A:: AbstractMatrix )
690714 # 3-arg ldiv!
691715 @eval ldiv! (C:: $Tri , D:: Diagonal , A:: $Tri ) = $ Tri (ldiv! (C. data, D, A. data))
692716 @eval ldiv! (C:: $Tri , D:: Diagonal , A:: $UTri ) = $ Tri (_setdiag! (ldiv! (C. data, D, A. data), inv, D. diag))
0 commit comments