Skip to content

Commit e25b357

Browse files
authored
make Diagonal+Symmetric return Symmetric (#35333)
* make Diagonal+Symmetric return Symmetric * introduce generic +/- AbstractMatrix with Diagonal * fix typos in tests * remove generic addition/subtraction with Diagonals
1 parent c973ad8 commit e25b357

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,21 @@ end
156156
(+)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag + Db.diag)
157157
(-)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag - Db.diag)
158158

159+
for f in (:+, :-)
160+
@eval function $f(D::Diagonal, S::Symmetric)
161+
return Symmetric($f(D, S.data), sym_uplo(S.uplo))
162+
end
163+
@eval function $f(S::Symmetric, D::Diagonal)
164+
return Symmetric($f(S.data, D), sym_uplo(S.uplo))
165+
end
166+
@eval function $f(D::Diagonal{<:Real}, H::Hermitian)
167+
return Hermitian($f(D, H.data), sym_uplo(H.uplo))
168+
end
169+
@eval function $f(H::Hermitian, D::Diagonal{<:Real})
170+
return Hermitian($f(H.data, D), sym_uplo(H.uplo))
171+
end
172+
end
173+
159174
(*)(x::Number, D::Diagonal) = Diagonal(x * D.diag)
160175
(*)(D::Diagonal, x::Number) = Diagonal(D.diag * x)
161176
(/)(D::Diagonal, x::Number) = Diagonal(D.diag / x)

stdlib/LinearAlgebra/test/diagonal.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,19 @@ Random.seed!(1)
200200
A = rand(elty, n, n)
201201
Asym = Symmetric(A + transpose(A), :U)
202202
Aherm = Hermitian(A + adjoint(A), :U)
203+
for op in (+, -)
204+
@test op(Asym, D) isa Symmetric
205+
@test Array(op(Asym, D)) Array(Symmetric(op(Array(Asym), Array(D))))
206+
@test op(D, Asym) isa Symmetric
207+
@test Array(op(D, Asym)) Array(Symmetric(op(Array(D), Array(Asym))))
208+
if !(elty <: Real)
209+
Dr = real(D)
210+
@test op(Aherm, Dr) isa Hermitian
211+
@test Array(op(Aherm, Dr)) Array(Hermitian(op(Array(Aherm), Array(Dr))))
212+
@test op(Dr, Aherm) isa Hermitian
213+
@test Array(op(Dr, Aherm)) Array(Hermitian(op(Array(Dr), Array(Aherm))))
214+
end
215+
end
203216
@test Array(D*Transpose(Asym)) Array(D) * Array(transpose(Asym))
204217
@test Array(D*Adjoint(Asym)) Array(D) * Array(adjoint(Asym))
205218
@test Array(D*Transpose(Aherm)) Array(D) * Array(transpose(Aherm))

0 commit comments

Comments
 (0)