@@ -104,31 +104,85 @@ end
104104/ {T<: Number }(D:: Diagonal , x:: T ) = Diagonal (D. diag / x)
105105* (Da:: Diagonal , Db:: Diagonal ) = Diagonal (Da. diag .* Db. diag)
106106* (D:: Diagonal , V:: AbstractVector ) = D. diag .* V
107- # To avoid ambiguity in the definitions below
108- for uplo in (:LowerTriangular , :UpperTriangular )
109- @eval begin
110- (* )(A:: $uplo , D:: Diagonal ) = $ uplo (A. data * D)
111-
112- function (* )(A:: $ (Symbol (:Unit , uplo)), D:: Diagonal )
113- B = A. data * D
114- for i = 1 : size (A, 1 )
115- B[i,i] = D. diag[i]
116- end
117- return $ uplo (B)
118- end
119- end
120- end
121- (* )(A:: AbstractTriangular , D:: Diagonal ) = error (" this method should never be reached" )
122- (* )(D:: Diagonal , A:: AbstractTriangular ) = error (" this method should never be reached" )
107+
108+ (* )(A:: AbstractTriangular , D:: Diagonal ) = A_mul_B! (copy (A), D)
109+ (* )(D:: Diagonal , B:: AbstractTriangular ) = A_mul_B! (D, copy (B))
123110
124111(* )(A:: AbstractMatrix , D:: Diagonal ) =
125112 scale! (similar (A, promote_op (* , eltype (A), eltype (D. diag))), A, D. diag)
126113(* )(D:: Diagonal , A:: AbstractMatrix ) =
127114 scale! (similar (A, promote_op (* , eltype (A), eltype (D. diag))), D. diag, A)
128115
129- A_mul_B! (A:: Diagonal ,B:: AbstractMatrix ) = scale! (A. diag,B)
130- At_mul_B! (A:: Diagonal ,B:: AbstractMatrix )= scale! (A. diag,B)
131- Ac_mul_B! (A:: Diagonal ,B:: AbstractMatrix )= scale! (conj (A. diag),B)
116+ A_mul_B! (A:: Union{LowerTriangular,UpperTriangular} , D:: Diagonal ) =
117+ typeof (A)(A_mul_B! (A. data, D))
118+ function A_mul_B! (A:: UnitLowerTriangular , D:: Diagonal )
119+ A_mul_B! (A. data, D)
120+ for i = 1 : size (A, 1 )
121+ A. data[i,i] = D. diag[i]
122+ end
123+ LowerTriangular (A. data)
124+ end
125+ function A_mul_B! (A:: UnitUpperTriangular , D:: Diagonal )
126+ A_mul_B! (A. data, D)
127+ for i = 1 : size (A, 1 )
128+ A. data[i,i] = D. diag[i]
129+ end
130+ UpperTriangular (A. data)
131+ end
132+ function A_mul_B! (D:: Diagonal , B:: UnitLowerTriangular )
133+ A_mul_B! (D, B. data)
134+ for i = 1 : size (B, 1 )
135+ B. data[i,i] = D. diag[i]
136+ end
137+ LowerTriangular (B. data)
138+ end
139+ function A_mul_B! (D:: Diagonal , B:: UnitUpperTriangular )
140+ A_mul_B! (D, B. data)
141+ for i = 1 : size (B, 1 )
142+ B. data[i,i] = D. diag[i]
143+ end
144+ UpperTriangular (B. data)
145+ end
146+
147+ Ac_mul_B (A:: AbstractTriangular , D:: Diagonal ) = A_mul_B! (ctranspose (A), D)
148+ function Ac_mul_B (A:: AbstractMatrix , D:: Diagonal )
149+ Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
150+ ctranspose! (Ac, A)
151+ A_mul_B! (Ac, D)
152+ end
153+
154+ At_mul_B (A:: AbstractTriangular , D:: Diagonal ) = A_mul_B! (transpose (A), D)
155+ function At_mul_B (A:: AbstractMatrix , D:: Diagonal )
156+ Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
157+ transpose! (Ac, A)
158+ A_mul_B! (Ac, D)
159+ end
160+
161+ A_mul_Bc (D:: Diagonal , B:: AbstractTriangular ) = A_mul_B! (D, ctranspose (B))
162+ A_mul_Bc (D:: Diagonal , Q:: Union{Base.LinAlg.QRCompactWYQ,Base.LinAlg.QRPackedQ} ) = A_mul_Bc! (Array (D), Q)
163+ function A_mul_Bc (D:: Diagonal , A:: AbstractMatrix )
164+ Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
165+ ctranspose! (Ac, A)
166+ A_mul_B! (D, Ac)
167+ end
168+
169+ A_mul_Bt (D:: Diagonal , B:: AbstractTriangular ) = A_mul_B! (D, transpose (B))
170+ function A_mul_Bt (D:: Diagonal , A:: AbstractMatrix )
171+ Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
172+ ctranspose! (Ac, A)
173+ A_mul_B! (D, Ac)
174+ end
175+
176+ A_mul_B! (A:: Diagonal ,B:: Diagonal ) = throw (MethodError (A_mul_B!, Tuple{Diagonal,Diagonal}))
177+ At_mul_B! (A:: Diagonal ,B:: Diagonal ) = throw (MethodError (At_mul_B!, Tuple{Diagonal,Diagonal}))
178+ Ac_mul_B! (A:: Diagonal ,B:: Diagonal ) = throw (MethodError (Ac_mul_B!, Tuple{Diagonal,Diagonal}))
179+ A_mul_B! (A:: Base.LinAlg.QRPackedQ , D:: Diagonal ) = throw (MethodError (A_mul_B!, Tuple{Diagonal,Diagonal}))
180+ A_mul_B! (A:: Diagonal ,B:: AbstractMatrix ) = scale! (A. diag,B)
181+ At_mul_B! (A:: Diagonal ,B:: AbstractMatrix ) = scale! (A. diag,B)
182+ Ac_mul_B! (A:: Diagonal ,B:: AbstractMatrix ) = scale! (conj (A. diag),B)
183+ A_mul_B! (A:: AbstractMatrix ,B:: Diagonal ) = scale! (A,B. diag)
184+ A_mul_Bt! (A:: AbstractMatrix ,B:: Diagonal ) = scale! (A,B. diag)
185+ A_mul_Bc! (A:: AbstractMatrix ,B:: Diagonal ) = scale! (A,conj (B. diag))
132186
133187/ (Da:: Diagonal , Db:: Diagonal ) = Diagonal (Da. diag ./ Db. diag )
134188function A_ldiv_B! {T} (D:: Diagonal{T} , v:: AbstractVector{T} )
0 commit comments