@@ -93,9 +93,18 @@ mult_ones(a, b) = mult_ones(a, b, mult_axes(a, b))
93
93
* (a:: AbstractFillMatrix , b:: AbstractZerosMatrix ) = mult_zeros (a, b)
94
94
* (a:: AbstractFillMatrix , b:: AbstractZerosVector ) = mult_zeros (a, b)
95
95
96
- * (a:: AbstractZerosMatrix , b:: AbstractMatrix ) = mult_zeros (a, b)
97
- * (a:: AbstractMatrix , b:: AbstractZerosVector ) = mult_zeros (a, b)
98
- * (a:: AbstractMatrix , b:: AbstractZerosMatrix ) = mult_zeros (a, b)
96
+ for MT in (:AbstractMatrix , :AbstractTriangular )
97
+ @eval * (a:: AbstractZerosMatrix , b:: $MT ) = mult_zeros (a, b)
98
+ @eval * (a:: $MT , b:: AbstractZerosMatrix ) = mult_zeros (a, b)
99
+ end
100
+ # Odd way to deal with the type-parameters to avoid ambiguities
101
+ for MT in (:(AbstractMatrix{T}), :(Transpose{<: Any , <: AbstractMatrix{T} }), :(Adjoint{<: Any , <: AbstractMatrix{T} }),
102
+ :(AbstractTriangular{T}))
103
+ @eval * (a:: $MT , b:: AbstractZerosVector ) where {T} = mult_zeros (a, b)
104
+ end
105
+ for MT in (:(Transpose{<: Any , <: AbstractVector }), :(Adjoint{<: Any , <: AbstractVector }))
106
+ @eval * (a:: $MT , b:: AbstractZerosMatrix ) = mult_zeros (a, b)
107
+ end
99
108
* (a:: AbstractZerosMatrix , b:: AbstractVector ) = mult_zeros (a, b)
100
109
101
110
function lmul_diag (a:: Diagonal , b)
@@ -290,13 +299,25 @@ function _adjvec_mul_zeros(a, b)
290
299
return a1 * b[1 ]
291
300
end
292
301
293
- * (a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} , b:: AbstractMatrix ) = (b' * a' )'
302
+ for MT in (:AbstractMatrix , :AbstractTriangular , :(Adjoint{<: Any ,<: TransposeAbsVec }))
303
+ @eval * (a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} , b:: $MT ) = (b' * a' )'
304
+ end
305
+ # ambiguity
306
+ function * (a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} , b:: TransposeAbsVec{<:Any,<:AdjointAbsVec} )
307
+ # change from Transpose ∘ Adjoint to Adjoint ∘ Transpose
308
+ b2 = adjoint (transpose (adjoint (transpose (b))))
309
+ a * b2
310
+ end
294
311
* (a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} , b:: AbstractZerosMatrix ) = (b' * a' )'
295
- * (a:: TransposeAbsVec{<:Any,<:AbstractZerosVector} , b:: AbstractMatrix ) = transpose (transpose (b) * transpose (a))
312
+ for MT in (:AbstractMatrix , :AbstractTriangular , :(Transpose{<: Any ,<: AdjointAbsVec }))
313
+ @eval * (a:: TransposeAbsVec{<:Any,<:AbstractZerosVector} , b:: $MT ) = transpose (transpose (b) * transpose (a))
314
+ end
296
315
* (a:: TransposeAbsVec{<:Any,<:AbstractZerosVector} , b:: AbstractZerosMatrix ) = transpose (transpose (b) * transpose (a))
297
316
298
317
* (a:: AbstractVector , b:: AdjOrTransAbsVec{<:Any,<:AbstractZerosVector} ) = a * permutedims (parent (b))
299
- * (a:: AbstractMatrix , b:: AdjOrTransAbsVec{<:Any,<:AbstractZerosVector} ) = a * permutedims (parent (b))
318
+ for MT in (:AbstractMatrix , :AbstractTriangular )
319
+ @eval * (a:: $MT , b:: AdjOrTransAbsVec{<:Any,<:AbstractZerosVector} ) = a * permutedims (parent (b))
320
+ end
300
321
* (a:: AbstractZerosVector , b:: AdjOrTransAbsVec{<:Any,<:AbstractZerosVector} ) = a * permutedims (parent (b))
301
322
* (a:: AbstractZerosMatrix , b:: AdjOrTransAbsVec{<:Any,<:AbstractZerosVector} ) = a * permutedims (parent (b))
302
323
307
328
308
329
* (a:: Adjoint{T, <:AbstractMatrix{T}} where T, b:: AbstractZeros{<:Any, 1} ) = mult_zeros (a, b)
309
330
310
- * (D:: Diagonal , a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} ) = (a' * D' )'
331
+ * (D:: Diagonal , a:: Adjoint{<:Any,<:AbstractZerosVector} ) = (a' * D' )'
332
+ * (D:: Diagonal , a:: Transpose{<:Any,<:AbstractZerosVector} ) = transpose (transpose (a) * transpose (D))
311
333
* (a:: AdjointAbsVec{<:Any,<:AbstractZerosVector} , D:: Diagonal ) = (D' * a' )'
312
334
* (a:: TransposeAbsVec{<:Any,<:AbstractZerosVector} , D:: Diagonal ) = transpose (D* transpose (a))
313
335
function _triple_zeromul (x, D:: Diagonal , y)
325
347
* (x:: TransposeAbsVec{<:Any,<:AbstractZerosVector} , D:: Diagonal , y:: AbstractZerosVector ) = _triple_zeromul (x, D, y)
326
348
327
349
328
- function * (a:: Transpose{T, <:AbstractVector{T} } , b:: AbstractZerosVector{T} ) where T<: Real
350
+ function * (a:: Transpose{T, <:AbstractVector} , b:: AbstractZerosVector{T} ) where T<: Real
329
351
la, lb = length (a), length (b)
330
352
if la ≠ lb
331
353
throw (DimensionMismatch (" dot product arguments have lengths $la and $lb " ))
0 commit comments