|
109 | 109 |
|
110 | 110 | const HermOrSym{T,S} = Union{Hermitian{T,S}, Symmetric{T,S}}
|
111 | 111 | const RealHermSymComplexHerm{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S}, Hermitian{Complex{T},S}}
|
| 112 | +const RealHermSymComplexSym{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S}, Symmetric{Complex{T},S}} |
112 | 113 |
|
113 | 114 | size(A::HermOrSym, d) = size(A.data, d)
|
114 | 115 | size(A::HermOrSym) = size(A.data)
|
@@ -303,6 +304,25 @@ A_mul_B!(C::StridedMatrix{T}, A::StridedMatrix{T}, B::Hermitian{T,<:StridedMatri
|
303 | 304 |
|
304 | 305 | *(A::HermOrSym, B::HermOrSym) = A*full(B)
|
305 | 306 |
|
| 307 | +# Fallbacks to avoid generic_matvecmul!/generic_matmatmul! |
| 308 | +## Symmetric{<:Number} and Hermitian{<:Real} are invariant to transpose; peel off the t |
| 309 | +At_mul_B(A::RealHermSymComplexSym, B::AbstractVector) = A*B |
| 310 | +At_mul_B(A::RealHermSymComplexSym, B::AbstractMatrix) = A*B |
| 311 | +A_mul_Bt(A::AbstractMatrix, B::RealHermSymComplexSym) = A*B |
| 312 | +## Hermitian{<:Number} and Symmetric{<:Real} are invariant to ctranspose; peel off the c |
| 313 | +Ac_mul_B(A::RealHermSymComplexHerm, B::AbstractVector) = A*B |
| 314 | +Ac_mul_B(A::RealHermSymComplexHerm, B::AbstractMatrix) = A*B |
| 315 | +A_mul_Bc(A::AbstractMatrix, B::RealHermSymComplexHerm) = A*B |
| 316 | + |
| 317 | +# ambiguities with RowVector |
| 318 | +A_mul_Bt(A::RowVector, B::RealHermSymComplexSym) = A*B |
| 319 | +A_mul_Bc(A::RowVector, B::RealHermSymComplexHerm) = A*B |
| 320 | +# ambiguities with AbstractTriangular |
| 321 | +At_mul_B(A::RealHermSymComplexSym, B::AbstractTriangular) = A*B |
| 322 | +A_mul_Bt(A::AbstractTriangular, B::RealHermSymComplexSym) = A*B |
| 323 | +Ac_mul_B(A::RealHermSymComplexHerm, B::AbstractTriangular) = A*B |
| 324 | +A_mul_Bc(A::AbstractTriangular, B::RealHermSymComplexHerm) = A*B |
| 325 | + |
306 | 326 | for T in (:Symmetric, :Hermitian), op in (:+, :-, :*, :/)
|
307 | 327 | # Deal with an ambiguous case
|
308 | 328 | @eval ($op)(A::$T, x::Bool) = ($T)(($op)(A.data, x), Symbol(A.uplo))
|
|
0 commit comments