diff --git a/src/dispatch.jl b/src/dispatch.jl index c1f4cf43..20f98e36 100644 --- a/src/dispatch.jl +++ b/src/dispatch.jl @@ -474,26 +474,27 @@ Base.:*(A::AbstractArray, α::AbstractMutable) = A .* α # Needed for Julia v1.0, otherwise, `broadcast(*, α, A)` gives a `Array` and # not a `Symmetric`. + +_mult_upper(α, A) = parent(α * LinearAlgebra.UpperTriangular(parent(A))) +_mult_lower(α, A) = parent(α * LinearAlgebra.LowerTriangular(parent(A))) + function Base.:*(α::Number, A::LinearAlgebra.Symmetric{<:AbstractMutable}) - return LinearAlgebra.Symmetric( - α * parent(A), - LinearAlgebra.sym_uplo(A.uplo), - ) + c = LinearAlgebra.sym_uplo(A.uplo) + B = c == :U ? _mult_upper(α, A) : _mult_lower(α, A) + return LinearAlgebra.Symmetric(B, c) end function Base.:*(α::Number, A::LinearAlgebra.Hermitian{<:AbstractMutable}) - return LinearAlgebra.Hermitian( - α * parent(A), - LinearAlgebra.sym_uplo(A.uplo), - ) + c = LinearAlgebra.sym_uplo(A.uplo) + B = c == :U ? _mult_upper(α, A) : _mult_lower(α, A) + return LinearAlgebra.Hermitian(B, c) end # Fix ambiguity identified by Aqua.jl. function Base.:*(α::Real, A::LinearAlgebra.Hermitian{<:AbstractMutable}) - return LinearAlgebra.Hermitian( - α * parent(A), - LinearAlgebra.sym_uplo(A.uplo), - ) + c = LinearAlgebra.sym_uplo(A.uplo) + B = c == :U ? _mult_upper(α, A) : _mult_lower(α, A) + return LinearAlgebra.Hermitian(B, c) end # These three have specific methods that just redirect to `Matrix{T}` which diff --git a/test/dispatch.jl b/test/dispatch.jl index cb57e596..5856459c 100644 --- a/test/dispatch.jl +++ b/test/dispatch.jl @@ -43,3 +43,15 @@ end @test MA.operate(LinearAlgebra.dot, z, z) == LinearAlgebra.dot(z, z) end end + +@testset "*(::Real, ::Union{Hermitian,Symmetric})" begin + A = DummyBigInt[1 2; 2 3] + B = DummyBigInt[2 4; 4 6] + @test MA.isequal_canonical(2 * A, B) + C = LinearAlgebra.Symmetric(B) + @test MA.isequal_canonical(2 * LinearAlgebra.Symmetric(A, :U), C) + @test MA.isequal_canonical(2 * LinearAlgebra.Symmetric(A, :L), C) + D = LinearAlgebra.Hermitian(B) + @test all(MA.isequal_canonical.(2 * LinearAlgebra.Hermitian(A, :L), D)) + @test all(MA.isequal_canonical.(2 * LinearAlgebra.Hermitian(A, :U), D)) +end