@@ -292,16 +292,65 @@ function (-)(A::UniformScaling, B::Diagonal{<:Number})
292
292
Diagonal (A. λ .- B. diag)
293
293
end
294
294
295
- rmul! (A:: AbstractTriangular , adjB:: Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}} ) =
296
- rmul! (full! (A), adjB)
297
- * (A:: AbstractTriangular , adjB:: Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}} ) =
298
- * (copyto! (similar (parent (A)), A), adjB)
299
- * (A:: BiTriSym , adjB:: Adjoint{<:Any,<:Union{QRCompactWYQ, QRPackedQ}} ) =
300
- rmul! (copyto! (Array {promote_type(eltype(A), eltype(adjB))} (undef, size (A)... ), A), adjB)
301
- * (adjA:: Adjoint{<:Any,<:Union{QRCompactWYQ, QRPackedQ}} , B:: Diagonal ) =
302
- lmul! (adjA, copyto! (Array {promote_type(eltype(adjA), eltype(B))} (undef, size (B)... ), B))
303
- * (adjA:: Adjoint{<:Any,<:Union{QRCompactWYQ, QRPackedQ}} , B:: BiTriSym ) =
304
- lmul! (adjA, copyto! (Array {promote_type(eltype(adjA), eltype(B))} (undef, size (B)... ), B))
295
+ lmul! (Q:: AbstractQ , B:: AbstractTriangular ) = lmul! (Q, full! (B))
296
+ lmul! (Q:: QRPackedQ , B:: AbstractTriangular ) = lmul! (Q, full! (B)) # disambiguation
297
+ lmul! (Q:: Adjoint{<:Any,<:AbstractQ} , B:: AbstractTriangular ) = lmul! (Q, full! (B))
298
+ lmul! (Q:: Adjoint{<:Any,<:QRPackedQ} , B:: AbstractTriangular ) = lmul! (Q, full! (B)) # disambiguation
299
+
300
+ function _qlmul (Q:: AbstractQ , B)
301
+ TQB = promote_type (eltype (Q), eltype (B))
302
+ if size (Q. factors, 1 ) == size (B, 1 )
303
+ Bnew = Matrix {TQB} (B)
304
+ elseif size (Q. factors, 2 ) == size (B, 1 )
305
+ Bnew = [Matrix {TQB} (B); zeros (TQB, size (Q. factors, 1 ) - size (B,1 ), size (B, 2 ))]
306
+ else
307
+ throw (DimensionMismatch (" first dimension of matrix must have size either $(size (Q. factors, 1 )) or $(size (Q. factors, 2 )) " ))
308
+ end
309
+ lmul! (convert (AbstractMatrix{TQB}, Q), Bnew)
310
+ end
311
+ function _qlmul (adjQ:: Adjoint{<:Any,<:AbstractQ} , B)
312
+ TQB = promote_type (eltype (adjQ), eltype (B))
313
+ lmul! (adjoint (convert (AbstractMatrix{TQB}, parent (adjQ))), Matrix {TQB} (B))
314
+ end
315
+
316
+ * (Q:: AbstractQ , B:: AbstractTriangular ) = _qlmul (Q, B)
317
+ * (Q:: Adjoint{<:Any,<:AbstractQ} , B:: AbstractTriangular ) = _qlmul (Q, B)
318
+ * (Q:: AbstractQ , B:: BiTriSym ) = _qlmul (Q, B)
319
+ * (Q:: Adjoint{<:Any,<:AbstractQ} , B:: BiTriSym ) = _qlmul (Q, B)
320
+ * (Q:: AbstractQ , B:: Diagonal ) = _qlmul (Q, B)
321
+ * (Q:: Adjoint{<:Any,<:AbstractQ} , B:: Diagonal ) = _qlmul (Q, B)
322
+
323
+ rmul! (A:: AbstractTriangular , Q:: AbstractQ ) = rmul! (full! (A), Q)
324
+ rmul! (A:: AbstractTriangular , Q:: Adjoint{<:Any,<:AbstractQ} ) = rmul! (full! (A), Q)
325
+
326
+ function _qrmul (A, Q:: AbstractQ )
327
+ TAQ = promote_type (eltype (A), eltype (Q))
328
+ return rmul! (Matrix {TAQ} (A), convert (AbstractMatrix{TAQ}, Q))
329
+ end
330
+ function _qrmul (A, adjQ:: Adjoint{<:Any,<:AbstractQ} )
331
+ Q = adjQ. parent
332
+ TAQ = promote_type (eltype (A), eltype (Q))
333
+ if size (A,2 ) == size (Q. factors, 1 )
334
+ Anew = Matrix {TAQ} (A)
335
+ elseif size (A,2 ) == size (Q. factors,2 )
336
+ Anew = [Matrix {TAQ} (A) zeros (TAQ, size (A, 1 ), size (Q. factors, 1 ) - size (Q. factors, 2 ))]
337
+ else
338
+ throw (DimensionMismatch (" matrix A has dimensions $(size (A)) but matrix B has dimensions $(size (Q)) " ))
339
+ end
340
+ return rmul! (Anew, adjoint (convert (AbstractMatrix{TAQ}, Q)))
341
+ end
342
+
343
+ * (A:: AbstractTriangular , Q:: AbstractQ ) = _qrmul (A, Q)
344
+ * (A:: AbstractTriangular , Q:: Adjoint{<:Any,<:AbstractQ} ) = _qrmul (A, Q)
345
+ * (A:: BiTriSym , Q:: AbstractQ ) = _qrmul (A, Q)
346
+ * (A:: BiTriSym , Q:: Adjoint{<:Any,<:AbstractQ} ) = _qrmul (A, Q)
347
+ * (A:: Diagonal , Q:: AbstractQ ) = _qrmul (A, Q)
348
+ * (A:: Diagonal , Q:: Adjoint{<:Any,<:AbstractQ} ) = _qrmul (A, Q)
349
+
350
+ * (Q:: AbstractQ , B:: AbstractQ ) = _qlmul (Q, B)
351
+ * (Q:: Adjoint{<:Any,<:AbstractQ} , B:: AbstractQ ) = _qrmul (Q, B)
352
+ * (Q:: AbstractQ , B:: Adjoint{<:Any,<:AbstractQ} ) = _qlmul (Q, B)
353
+ * (Q:: Adjoint{<:Any,<:AbstractQ} , B:: Adjoint{<:Any,<:AbstractQ} ) = _qrmul (Q, B)
305
354
306
355
# fill[stored]! methods
307
356
fillstored! (A:: Diagonal , x) = (fill! (A. diag, x); A)
0 commit comments