Skip to content

Commit 1029227

Browse files
committed
Define copy! for Symmetric and Hermitian
1 parent 7b41e72 commit 1029227

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

base/linalg/symmetric.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ convert{T}(::Type{AbstractMatrix{T}}, A::Hermitian) = Hermitian(convert(Abstract
133133

134134
copy{T,S}(A::Symmetric{T,S}) = (B = copy(A.data); Symmetric{T,typeof(B)}(B,A.uplo))
135135
copy{T,S}(A::Hermitian{T,S}) = (B = copy(A.data); Hermitian{T,typeof(B)}(B,A.uplo))
136+
copy!(dest::Symmetric, src::Symmetric) = Symmetric(copy!(dest.data, src.data), Symbol(src.uplo))
137+
copy!(dest::Hermitian, src::Hermitian) = Hermitian(copy!(dest.data, src.data), Symbol(src.uplo))
136138
ishermitian(A::Hermitian) = true
137139
ishermitian{T<:Real,S}(A::Symmetric{T,S}) = true
138140
ishermitian{T<:Complex,S}(A::Symmetric{T,S}) = all(imag(A.data) .== 0)

base/linalg/uniformscaling.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ ishermitian(J::UniformScaling) = isreal(J.λ)
5656
(-)(B::BitArray{2}, J::UniformScaling) = Array(B) - J
5757
(-)(J::UniformScaling, B::BitArray{2}) = J - Array(B)
5858

59+
for t in (:Symmetric, :Hermitian), op in (:+, :-)
60+
@eval ($op)(X::$t, J::UniformScaling) = ($t)(($op)(X.data, J), Symbol(X.uplo))
61+
end
62+
5963
for (t1, t2) in ((:UnitUpperTriangular, :UpperTriangular),
6064
(:UnitLowerTriangular, :LowerTriangular))
6165
for op in (:+,:-)

test/linalg/symmetric.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,17 @@ let a = randn(2,2)
250250
cc = copy(c)
251251
@test conj!(c) == conj(Array(c))
252252
end
253+
254+
# 19225
255+
let X = sparse([1 -1; -1 1])
256+
for T in (Symmetric, Hermitian)
257+
Y = T(X)
258+
_Y = similar(Y)
259+
copy!(_Y, Y)
260+
@test _Y == Y
261+
@test Y + I == T(sparse([2 -1; -1 2]))
262+
@test Y - I == T(sparse([0 -1; -1 0]))
263+
end
264+
@test_throws ArgumentError Hermitian(X) + 2im*I
265+
@test_throws ArgumentError Hermitian(X) - 2im*I
266+
end

0 commit comments

Comments
 (0)