Skip to content

Commit 94d543e

Browse files
committed
carry out (c)transpose in Ax_mul_Bx methods for Hermitian and Symmetric
- Symmetric and Hermitian{<:Real} are invariant to transpose so it is a no-op - ctranspose(Hermitian{<:Complex}) is faster to carry out then ending up in generic_matmatmul - Hermitian and Symmetric{<:Real} are invariant to ctranspose so it is a no-op - transpose(Hermitian{<:Complex}) is faster to carry out then ending up in generic_matmatmul
1 parent 47a1150 commit 94d543e

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

base/linalg/symmetric.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,26 @@ A_mul_B!(C::StridedMatrix{T}, A::StridedMatrix{T}, B::Hermitian{T,<:StridedMatri
301301

302302
*(A::HermOrSym, B::HermOrSym) = A*full(B)
303303

304+
# Fallbacks to avoid generic_matvecmul!/generic_matmatmul!
305+
## Symmetric and Hermitian{<:Real} are invariant to transpose and for
306+
## Hermitian{<:Real} it is faster to carry out the transposition
307+
At_mul_B( A::HermOrSym, B::AbstractVector) = transpose(A)*B
308+
At_mul_B( A::HermOrSym, B::AbstractMatrix) = transpose(A)*B
309+
At_mul_Bt(A::HermOrSym, B::AbstractMatrix) = transpose(A)*B
310+
At_mul_Bc(A::HermOrSym, B::AbstractMatrix) = transpose(A)*B
311+
A_mul_Bt( A::AbstractMatrix, B::HermOrSym) = A*transpose(B)
312+
At_mul_Bt(A::AbstractMatrix, B::HermOrSym) = A*transpose(B)
313+
Ac_mul_Bt(A::AbstractMatrix, B::HermOrSym) = A*transpose(B)
314+
## Hermitian and Symmetric{<:Real} are invariant to ctranspose and for
315+
## Symmetric{<:Complex} it is faster to carry out the ctransposition
316+
Ac_mul_B( A::HermOrSym, B::AbstractVector) = ctranspose(A)*B
317+
Ac_mul_B( A::HermOrSym, B::AbstractMatrix) = ctranspose(A)*B
318+
Ac_mul_Bt(A::HermOrSym, B::AbstractMatrix) = ctranspose(A)*B
319+
Ac_mul_Bc(A::HermOrSym, B::AbstractMatrix) = ctranspose(A)*B
320+
A_mul_Bc( A::AbstractMatrix, B::HermOrSym) = A*ctranspose(B)
321+
At_mul_Bc(A::AbstractMatrix, B::HermOrSym) = A*ctranspose(B)
322+
Ac_mul_Bc(A::AbstractMatrix, B::HermOrSym) = A*ctranspose(B)
323+
304324
for T in (:Symmetric, :Hermitian), op in (:+, :-, :*, :/)
305325
# Deal with an ambiguous case
306326
@eval ($op)(A::$T, x::Bool) = ($T)(($op)(A.data, x), Symbol(A.uplo))

0 commit comments

Comments
 (0)