1313 :(SMatrix {M,N,T} ($ (expr... )))
1414end
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)
1819end
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+
2030function \ {T,M}(D:: SDiagonal , b:: SVector{M,T} )
2131 D. diag .* b
2232end
2333
24- SDiagonal (A:: SMatrix ) = SDiagonal (diag (A))
25-
26-
2734convert {N,T} (:: Type{SDiagonal{N,T}} , D:: SDiagonal{N,T} ) = D
2835convert {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
4552end
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
5555ishermitian {T<:Real} (D:: SDiagonal{T} ) = true
5656ishermitian (D:: SDiagonal ) = all (D. diag .== real (D. diag))
0 commit comments