@@ -150,109 +150,99 @@ end
150
150
(* )(Da:: Diagonal , Db:: Diagonal ) = Diagonal (Da. diag .* Db. diag)
151
151
(* )(D:: Diagonal , V:: AbstractVector ) = D. diag .* V
152
152
153
- (* )(A:: AbstractTriangular , D:: Diagonal ) = mul ! (copy (A), D)
154
- (* )(D:: Diagonal , B:: AbstractTriangular ) = mul ! (D, copy (B))
153
+ (* )(A:: AbstractTriangular , D:: Diagonal ) = mul1 ! (copy (A), D)
154
+ (* )(D:: Diagonal , B:: AbstractTriangular ) = mul2 ! (D, copy (B))
155
155
156
156
(* )(A:: AbstractMatrix , D:: Diagonal ) =
157
157
scale! (similar (A, promote_op (* , eltype (A), eltype (D. diag)), size (A)), A, D. diag)
158
158
(* )(D:: Diagonal , A:: AbstractMatrix ) =
159
159
scale! (similar (A, promote_op (* , eltype (A), eltype (D. diag)), size (A)), D. diag, A)
160
160
161
- mul! (A:: Union{LowerTriangular,UpperTriangular} , D:: Diagonal ) = typeof (A)(mul! (A. data, D))
162
- function mul! (A:: UnitLowerTriangular , D:: Diagonal )
163
- mul! (A. data, D)
161
+
162
+ mul1! (A:: Union{LowerTriangular,UpperTriangular} , D:: Diagonal ) = typeof (A)(mul1! (A. data, D))
163
+ function mul1! (A:: UnitLowerTriangular , D:: Diagonal )
164
+ mul1! (A. data, D)
164
165
for i = 1 : size (A, 1 )
165
166
A. data[i,i] = D. diag[i]
166
167
end
167
168
LowerTriangular (A. data)
168
169
end
169
- function mul ! (A:: UnitUpperTriangular , D:: Diagonal )
170
- mul ! (A. data, D)
170
+ function mul1 ! (A:: UnitUpperTriangular , D:: Diagonal )
171
+ mul1 ! (A. data, D)
171
172
for i = 1 : size (A, 1 )
172
173
A. data[i,i] = D. diag[i]
173
174
end
174
175
UpperTriangular (A. data)
175
176
end
176
- function mul! (D:: Diagonal , B:: UnitLowerTriangular )
177
- mul! (D, B. data)
177
+
178
+ function mul2! (D:: Diagonal , B:: UnitLowerTriangular )
179
+ mul2! (D, B. data)
178
180
for i = 1 : size (B, 1 )
179
181
B. data[i,i] = D. diag[i]
180
182
end
181
183
LowerTriangular (B. data)
182
184
end
183
- function mul ! (D:: Diagonal , B:: UnitUpperTriangular )
184
- mul ! (D, B. data)
185
+ function mul2 ! (D:: Diagonal , B:: UnitUpperTriangular )
186
+ mul2 ! (D, B. data)
185
187
for i = 1 : size (B, 1 )
186
188
B. data[i,i] = D. diag[i]
187
189
end
188
190
UpperTriangular (B. data)
189
191
end
190
192
193
+
191
194
* (adjD:: Adjoint{<:Any,<:Diagonal} , B:: Diagonal ) = (D = adjD. parent; Diagonal (adjoint .(D. diag) .* B. diag))
192
- * (adjA:: Adjoint{<:Any,<:AbstractTriangular} , D:: Diagonal ) = (A = adjA. parent; mul! (adjoint (A), D))
195
+ * (adjA:: Adjoint{<:Any,<:AbstractTriangular} , D:: Diagonal ) = (A = adjA. parent; mul1! (adjoint (A), D))
196
+
193
197
function * (adjA:: Adjoint{<:Any,<:AbstractMatrix} , D:: Diagonal )
194
198
A = adjA. parent
195
199
Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
196
200
adjoint! (Ac, A)
197
- mul ! (Ac, D)
201
+ mul1 ! (Ac, D)
198
202
end
199
203
200
204
* (transD:: Transpose{<:Any,<:Diagonal} , B:: Diagonal ) = (D = transD. parent; Diagonal (transpose .(D. diag) .* B. diag))
201
- * (transA:: Transpose{<:Any,<:AbstractTriangular} , D:: Diagonal ) = (A = transA. parent; mul ! (transpose (A), D))
205
+ * (transA:: Transpose{<:Any,<:AbstractTriangular} , D:: Diagonal ) = (A = transA. parent; mul1 ! (transpose (A), D))
202
206
function * (transA:: Transpose{<:Any,<:AbstractMatrix} , D:: Diagonal )
203
207
A = transA. parent
204
208
At = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
205
209
transpose! (At, A)
206
- mul ! (At, D)
210
+ mul1 ! (At, D)
207
211
end
208
212
209
213
* (D:: Diagonal , adjB:: Adjoint{<:Any,<:Diagonal} ) = (B = adjB. parent; Diagonal (D. diag .* adjoint .(B. diag)))
210
- * (D:: Diagonal , adjB:: Adjoint{<:Any,<:AbstractTriangular} ) = (B = adjB. parent; mul ! (D, adjoint (B)))
211
- * (D:: Diagonal , adjQ:: Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}} ) = (Q = adjQ. parent; mul ! (Array (D), Adjoint (Q)))
214
+ * (D:: Diagonal , adjB:: Adjoint{<:Any,<:AbstractTriangular} ) = (B = adjB. parent; mul2 ! (D, adjoint (B)))
215
+ * (D:: Diagonal , adjQ:: Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}} ) = (Q = adjQ. parent; mul1 ! (Array (D), Adjoint (Q)))
212
216
function * (D:: Diagonal , adjA:: Adjoint{<:Any,<:AbstractMatrix} )
213
217
A = adjA. parent
214
218
Ac = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
215
219
adjoint! (Ac, A)
216
- mul ! (D, Ac)
220
+ mul2 ! (D, Ac)
217
221
end
218
222
219
223
* (D:: Diagonal , transB:: Transpose{<:Any,<:Diagonal} ) = (B = transB. parent; Diagonal (D. diag .* transpose .(B. diag)))
220
- * (D:: Diagonal , transB:: Transpose{<:Any,<:AbstractTriangular} ) = (B = transB. parent; mul ! (D, transpose (B)))
224
+ * (D:: Diagonal , transB:: Transpose{<:Any,<:AbstractTriangular} ) = (B = transB. parent; mul2 ! (D, transpose (B)))
221
225
function * (D:: Diagonal , transA:: Transpose{<:Any,<:AbstractMatrix} )
222
226
A = transA. parent
223
227
At = similar (A, promote_op (* , eltype (A), eltype (D. diag)), (size (A, 2 ), size (A, 1 )))
224
228
transpose! (At, A)
225
- mul ! (D, At)
229
+ mul2 ! (D, At)
226
230
end
227
231
228
232
* (adjD:: Adjoint{<:Any,<:Diagonal} , adjB:: Adjoint{<:Any,<:Diagonal} ) =
229
233
(D = adjD. parent; B = adjB. parent; Diagonal (adjoint .(D. diag) .* adjoint .(B. diag)))
230
234
* (transD:: Transpose{<:Any,<:Diagonal} , transB:: Transpose{<:Any,<:Diagonal} ) =
231
235
(D = transD. parent; B = transB. parent; Diagonal (transpose .(D. diag) .* transpose .(B. diag)))
232
236
233
- mul! (A:: Diagonal , B:: Diagonal ) = throw (MethodError (mul!, Tuple{Diagonal,Diagonal}))
234
- mul! (A:: QRPackedQ , D:: Diagonal ) = throw (MethodError (mul!, Tuple{Diagonal,Diagonal}))
235
- mul! (A:: QRPackedQ , B:: Adjoint{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
236
- mul! (A:: QRPackedQ , B:: Transpose{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
237
- mul! (A:: Adjoint{<:Any,<:QRPackedQ} , B:: Diagonal ) = throw (MethodError (mul!, (A, B)))
238
- mul! (A:: Adjoint{<:Any,<:QRPackedQ} , B:: Adjoint{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
239
- mul! (A:: Adjoint{<:Any,<:QRPackedQ} , B:: Transpose{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
240
- mul! (A:: Diagonal , B:: Adjoint{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
241
- mul! (A:: Diagonal , B:: Transpose{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
242
- mul! (A:: Adjoint{<:Any,<:Diagonal} , B:: Adjoint{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
243
- mul! (A:: Adjoint{<:Any,<:Diagonal} , B:: Transpose{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
244
- mul! (A:: Transpose{<:Any,<:Diagonal} , B:: Adjoint{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
245
- mul! (A:: Transpose{<:Any,<:Diagonal} , B:: Transpose{<:Any,<:Diagonal} ) = throw (MethodError (mul!, (A, B)))
246
- mul! (transA:: Transpose{<:Any,<:Diagonal} , B:: Diagonal ) =
247
- throw (MethodError (mul!, Tuple{Transpose{<: Any ,<: Diagonal },Diagonal}))
248
- mul! (adjA:: Adjoint{<:Any,<:Diagonal} , B:: Diagonal ) =
249
- throw (MethodError (mul!, Tuple{Adjoint{<: Any ,<: Diagonal },Diagonal}))
250
- mul! (A:: Diagonal , B:: AbstractMatrix ) = scale! (A. diag, B)
251
- mul! (adjA:: Adjoint{<:Any,<:Diagonal} , B:: AbstractMatrix ) = (A = adjA. parent; scale! (conj (A. diag),B))
252
- mul! (transA:: Transpose{<:Any,<:Diagonal} , B:: AbstractMatrix ) = (A = transA. parent; scale! (A. diag,B))
253
- mul! (A:: AbstractMatrix , B:: Diagonal ) = scale! (A,B. diag)
254
- mul! (A:: AbstractMatrix , adjB:: Adjoint{<:Any,<:Diagonal} ) = (B = adjB. parent; scale! (A,conj (B. diag)))
255
- mul! (A:: AbstractMatrix , transB:: Transpose{<:Any,<:Diagonal} ) = (B = transB. parent; scale! (A,B. diag))
237
+ mul1! (A:: Diagonal ,B:: Diagonal ) = Diagonal (A. diag .*= B. diag)
238
+ mul2! (A:: Diagonal ,B:: Diagonal ) = Diagonal (B. diag .= A. diag .* B. diag)
239
+
240
+ mul2! (A:: Diagonal , B:: AbstractMatrix ) = scale! (A. diag, B)
241
+ mul2! (adjA:: Adjoint{<:Any,<:Diagonal} , B:: AbstractMatrix ) = (A = adjA. parent; scale! (conj (A. diag),B))
242
+ mul2! (transA:: Transpose{<:Any,<:Diagonal} , B:: AbstractMatrix ) = (A = transA. parent; scale! (A. diag,B))
243
+ mul1! (A:: AbstractMatrix , B:: Diagonal ) = scale! (A,B. diag)
244
+ mul1! (A:: AbstractMatrix , adjB:: Adjoint{<:Any,<:Diagonal} ) = (B = adjB. parent; scale! (A,conj (B. diag)))
245
+ mul1! (A:: AbstractMatrix , transB:: Transpose{<:Any,<:Diagonal} ) = (B = transB. parent; scale! (A,B. diag))
256
246
257
247
# Get ambiguous method if try to unify AbstractVector/AbstractMatrix here using AbstractVecOrMat
258
248
mul! (out:: AbstractVector , A:: Diagonal , in:: AbstractVector ) = out .= A. diag .* in
@@ -296,6 +286,7 @@ mul!(C::AbstractMatrix, transA::Transpose{<:Any,<:Diagonal}, transB::Transpose{<
296
286
297
287
298
288
(/ )(Da:: Diagonal , Db:: Diagonal ) = Diagonal (Da. diag ./ Db. diag)
289
+
299
290
function ldiv! (D:: Diagonal{T} , v:: AbstractVector{T} ) where {T}
300
291
if length (v) != length (D. diag)
301
292
throw (DimensionMismatch (" diagonal matrix is $(length (D. diag)) by $(length (D. diag)) but right hand side has $(length (v)) rows" ))
@@ -325,6 +316,7 @@ function ldiv!(D::Diagonal{T}, V::AbstractMatrix{T}) where {T}
325
316
V
326
317
end
327
318
319
+
328
320
ldiv! (adjD:: Adjoint{<:Any,<:Diagonal{T}} , B:: AbstractVecOrMat{T} ) where {T} =
329
321
(D = adjD. parent; ldiv! (conj (D), B))
330
322
ldiv! (transD:: Transpose{<:Any,<:Diagonal{T}} , B:: AbstractVecOrMat{T} ) where {T} =
@@ -348,6 +340,7 @@ function rdiv!(A::AbstractMatrix{T}, D::Diagonal{T}) where {T}
348
340
A
349
341
end
350
342
343
+
351
344
rdiv! (A:: AbstractMatrix{T} , adjD:: Adjoint{<:Any,<:Diagonal{T}} ) where {T} =
352
345
(D = adjD. parent; rdiv! (A, conj (D)))
353
346
rdiv! (A:: AbstractMatrix{T} , transD:: Transpose{<:Any,<:Diagonal{T}} ) where {T} =
0 commit comments