@@ -292,16 +292,65 @@ function (-)(A::UniformScaling, B::Diagonal{<:Number})
292292 Diagonal (A. λ .- B. diag)
293293end
294294
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)
305354
306355# fill[stored]! methods
307356fillstored! (A:: Diagonal , x) = (fill! (A. diag, x); A)
0 commit comments