@@ -109,16 +109,18 @@ julia> SymTridiagonal(B)
109109"""
110110function SymTridiagonal (A:: AbstractMatrix )
111111 checksquare (A)
112- du = diag (A, 1 )
113- d = diag (A)
114- dl = diag (A, - 1 )
115- if all (((x, y),) -> x == transpose (y), zip (du, dl)) && all (issymmetric, d)
112+ if _checksymmetric (A)
113+ du = diag (A, 1 )
114+ d = diag (A)
116115 SymTridiagonal (d, du)
117116 else
118117 throw (ArgumentError (" matrix is not symmetric; cannot convert to SymTridiagonal" ))
119118 end
120119end
121120
121+ _checksymmetric (d, du, dl) = all (((x, y),) -> x == transpose (y), zip (du, dl)) && all (issymmetric, d)
122+ _checksymmetric (A:: AbstractMatrix ) = _checksymmetric (diagview (A), diagview (A, 1 ), diagview (A, - 1 ))
123+
122124SymTridiagonal {T,V} (S:: SymTridiagonal{T,V} ) where {T,V<: AbstractVector{T} } = S
123125SymTridiagonal {T,V} (S:: SymTridiagonal ) where {T,V<: AbstractVector{T} } =
124126 SymTridiagonal (convert (V, S. dv):: V , convert (V, S. ev):: V )
@@ -128,6 +130,11 @@ SymTridiagonal{T}(S::SymTridiagonal) where {T} =
128130 convert (AbstractVector{T}, S. ev):: AbstractVector{T} )
129131SymTridiagonal (S:: SymTridiagonal ) = S
130132
133+ function convert (:: Type{T} , A:: AbstractMatrix ) where T<: SymTridiagonal
134+ checksquare (A)
135+ _checksymmetric (A) && isbanded (A, - 1 , 1 ) ? T (A) : throw (InexactError (:convert , T, A))
136+ end
137+
131138AbstractMatrix {T} (S:: SymTridiagonal ) where {T} = SymTridiagonal {T} (S)
132139AbstractMatrix {T} (S:: SymTridiagonal{T} ) where {T} = copy (S)
133140
@@ -605,6 +612,11 @@ function Tridiagonal{T,V}(A::Tridiagonal) where {T,V<:AbstractVector{T}}
605612 end
606613end
607614
615+ function convert (:: Type{T} , A:: AbstractMatrix ) where T<: Tridiagonal
616+ checksquare (A)
617+ isbanded (A, - 1 , 1 ) ? T (A) : throw (InexactError (:convert , T, A))
618+ end
619+
608620size (M:: Tridiagonal ) = (n = length (M. d); (n, n))
609621axes (M:: Tridiagonal ) = (ax = axes (M. d,1 ); (ax, ax))
610622
0 commit comments