@@ -317,8 +317,9 @@ function mul!(C::AbstractMatrix, Da::Diagonal, Db::Diagonal, alpha::Number, beta
317
317
return C
318
318
end
319
319
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)
322
323
323
324
rdiv! (A:: AbstractVecOrMat , D:: Diagonal ) = _rdiv! (A, A, D)
324
325
# avoid copy when possible via internal 3-arg backend
@@ -338,21 +339,10 @@ function _rdiv!(B::AbstractVecOrMat, A::AbstractVecOrMat, D::Diagonal)
338
339
end
339
340
B
340
341
end
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
350
342
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)
353
344
354
345
ldiv! (D:: Diagonal , B:: AbstractVecOrMat ) = ldiv! (B, D, B)
355
- ldiv! (Dc:: Diagonal , Da:: Diagonal , Db:: Diagonal ) = Diagonal (ldiv! (Dc. diag, Da, Db. diag))
356
346
function ldiv! (B:: AbstractVecOrMat , D:: Diagonal , A:: AbstractVecOrMat )
357
347
require_one_based_indexing (A, B)
358
348
d = length (D. diag)
@@ -365,6 +355,19 @@ function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat)
365
355
B .= D. diag .\ A
366
356
end
367
357
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
+
368
371
# (l/r)mul!, l/rdiv!, *, / and \ Optimization for AbstractTriangular.
369
372
# These functions are generally more efficient if we calculate the whole data field.
370
373
# The following code implements them in a unified patten to avoid missing.
0 commit comments