Skip to content

Commit

Permalink
Preserve Symmetric/Hermitian shape in more cases (#40126)
Browse files Browse the repository at this point in the history
  • Loading branch information
sostock authored Mar 23, 2021
1 parent a134fac commit 3071f34
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
4 changes: 4 additions & 0 deletions stdlib/LinearAlgebra/src/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,10 @@ for f in (:+, :-)
@eval begin
$f(A::Hermitian, B::Symmetric{<:Real}) = $f(A, Hermitian(parent(B), sym_uplo(B.uplo)))
$f(A::Symmetric{<:Real}, B::Hermitian) = $f(Hermitian(parent(A), sym_uplo(A.uplo)), B)
$f(A::SymTridiagonal, B::Symmetric) = Symmetric($f(A, B.data), sym_uplo(B.uplo))
$f(A::Symmetric, B::SymTridiagonal) = Symmetric($f(A.data, B), sym_uplo(A.uplo))
$f(A::SymTridiagonal{<:Real}, B::Hermitian) = Hermitian($f(A, B.data), sym_uplo(B.uplo))
$f(A::Hermitian, B::SymTridiagonal{<:Real}) = Hermitian($f(A.data, B), sym_uplo(A.uplo))
end
end

Expand Down
25 changes: 25 additions & 0 deletions stdlib/LinearAlgebra/test/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -727,4 +727,29 @@ end
end
end

@testset "Addition/subtraction with SymTridiagonal" begin
TR = SymTridiagonal(randn(Float64,5), randn(Float64,4))
TC = SymTridiagonal(randn(ComplexF64,5), randn(ComplexF64,4))
SR = Symmetric(randn(Float64,5,5))
SC = Symmetric(randn(ComplexF64,5,5))
HR = Hermitian(randn(Float64,5,5))
HC = Hermitian(randn(ComplexF64,5,5))
for op = (+,-)
for T = (TR, TC), S = (SR, SC)
@test op(T, S) == op(Array(T), S)
@test op(S, T) == op(S, Array(T))
@test op(T, S) isa Symmetric
@test op(S, T) isa Symmetric
end
for H = (HR, HC)
for T = (TR, TC)
@test op(T, H) == op(Array(T), H)
@test op(H, T) == op(H, Array(T))
end
@test op(TR, H) isa Hermitian
@test op(H, TR) isa Hermitian
end
end
end

end # module TestSymmetric

0 comments on commit 3071f34

Please sign in to comment.