@@ -317,8 +317,9 @@ function mul!(C::AbstractMatrix, Da::Diagonal, Db::Diagonal, alpha::Number, beta
317317 return C
318318end
319319
320- (/ )(A:: AbstractVecOrMat , D:: Diagonal ) =
321- _rdiv! (similar (A, promote_op (/ , eltype (A), eltype (D))), A, D)
320+ _promote_dotop (f, args... ) = promote_op (f, eltype .(args)... )
321+
322+ / (A:: AbstractVecOrMat , D:: Diagonal ) = _rdiv! (similar (A, _promote_dotop (/ , A, D), size (A)), A, D)
322323
323324rdiv! (A:: AbstractVecOrMat , D:: Diagonal ) = _rdiv! (A, A, D)
324325# avoid copy when possible via internal 3-arg backend
@@ -338,21 +339,10 @@ function _rdiv!(B::AbstractVecOrMat, A::AbstractVecOrMat, D::Diagonal)
338339 end
339340 B
340341end
341- # Optimization for Diagonal / Diagonal
342- function _rdiv! (Dc:: Diagonal , Db:: Diagonal , Da:: Diagonal )
343- n, k = length (Db. diag), length (Db. diag)
344- n == k || throw (DimensionMismatch (" left hand side has $n columns but D is $k by $k " ))
345- j = findfirst (iszero, Da. diag)
346- isnothing (j) || throw (SingularException (j))
347- Dc. diag .= Db. diag ./ Da. diag
348- Dc
349- end
350342
351- (\ )(D:: Diagonal , B:: AbstractVecOrMat ) =
352- ldiv! (similar (B, promote_op (\ , eltype (D), eltype (B))), D, B)
343+ \ (D:: Diagonal , B:: AbstractVecOrMat ) = ldiv! (similar (B, _promote_dotop (\ , D, B), size (B)), D, B)
353344
354345ldiv! (D:: Diagonal , B:: AbstractVecOrMat ) = ldiv! (B, D, B)
355- ldiv! (Dc:: Diagonal , Da:: Diagonal , Db:: Diagonal ) = Diagonal (ldiv! (Dc. diag, Da, Db. diag))
356346function ldiv! (B:: AbstractVecOrMat , D:: Diagonal , A:: AbstractVecOrMat )
357347 require_one_based_indexing (A, B)
358348 d = length (D. diag)
@@ -365,6 +355,19 @@ function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat)
365355 B .= D. diag .\ A
366356end
367357
358+ # Optimizations for \, / between Diagonals
359+ \ (D:: Diagonal , B:: Diagonal ) = ldiv! (similar (B, _promote_dotop (\ , D, B)), D, B)
360+ / (A:: Diagonal , D:: Diagonal ) = _rdiv! (similar (A, _promote_dotop (/ , A, D)), A, D)
361+ function _rdiv! (Dc:: Diagonal , Db:: Diagonal , Da:: Diagonal )
362+ n, k = length (Db. diag), length (Db. diag)
363+ n == k || throw (DimensionMismatch (" left hand side has $n columns but D is $k by $k " ))
364+ j = findfirst (iszero, Da. diag)
365+ isnothing (j) || throw (SingularException (j))
366+ Dc. diag .= Db. diag ./ Da. diag
367+ Dc
368+ end
369+ ldiv! (Dc:: Diagonal , Da:: Diagonal , Db:: Diagonal ) = Diagonal (ldiv! (Dc. diag, Da, Db. diag))
370+
368371# (l/r)mul!, l/rdiv!, *, / and \ Optimization for AbstractTriangular.
369372# These functions are generally more efficient if we calculate the whole data field.
370373# The following code implements them in a unified patten to avoid missing.
0 commit comments