Skip to content

Commit 1eeb98b

Browse files
committed
Inherit from AbstractMatrix
1 parent aebf3bc commit 1eeb98b

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

src/SDiagonal.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,24 @@ end
1313
:(SMatrix{M,N,T}($(expr...)))
1414
end
1515

16-
struct SDiagonal{N,T}
16+
struct SDiagonal{N,T} <: StaticMatrix{N, N, T}
1717
diag::SVector{N,T}
18+
SDiagonal{N,T}(diag::SVector{N,T}) where {N,T} = new(diag)
1819
end
1920

21+
# this is to deal with convert.jl
22+
@inline (::Type{SDiagonal})(a::AbstractVector) = SDiagonal(SVector(a))
23+
@inline (::Type{SDiagonal}){N,T}(a::SVector{N,T}) = SDiagonal{N,T}(a)
24+
25+
@generated function SDiagonal{N,T}(a::SMatrix{N,N,T})
26+
expr = [:(a[$i,$i]) for i=1:N]
27+
:(SDiagonal{N,T}($(expr...)))
28+
end
29+
2030
function \{T,M}(D::SDiagonal, b::SVector{M,T} )
2131
D.diag .* b
2232
end
2333

24-
SDiagonal(A::SMatrix) = SDiagonal(diag(A))
25-
26-
2734
convert{N,T}(::Type{SDiagonal{N,T}}, D::SDiagonal{N,T}) = D
2835
convert{N,T}(::Type{SDiagonal{N,T}}, D::SDiagonal) = SDiagonal{N,T}(convert(SVector{N,T}, D.diag))
2936

@@ -43,14 +50,7 @@ function getindex{T}(D::SDiagonal{T}, i::Int, j::Int)
4350
zero(T)
4451
end
4552
end
46-
function setindex!(D::SDiagonal, v, i::Int, j::Int)
47-
if i == j
48-
unsafe_setindex!(D.diag, v, i)
49-
elseif v != 0
50-
throw(ArgumentError("cannot set an off-diagonal index ($i, $j) to a nonzero value ($v)"))
51-
end
52-
D
53-
end
53+
5454

5555
ishermitian{T<:Real}(D::SDiagonal{T}) = true
5656
ishermitian(D::SDiagonal) = all(D.diag .== real(D.diag))

0 commit comments

Comments
 (0)