@@ -107,18 +107,21 @@ julia> SymTridiagonal(B)
107107 [1 2; 3 4] [1 2; 2 3]
108108```
109109"""
110- function SymTridiagonal ( A:: AbstractMatrix )
110+ function ( :: Type{SymTri} )( A:: AbstractMatrix ) where {SymTri <: SymTridiagonal }
111111 checksquare (A)
112112 du = diag (A, 1 )
113113 d = diag (A)
114114 dl = diag (A, - 1 )
115- if all (((x, y),) -> x == transpose (y), zip ( du, dl)) && all (issymmetric, d )
116- SymTridiagonal (d, du)
115+ if _checksymmetric (d, du, dl)
116+ SymTri (d, du)
117117 else
118118 throw (ArgumentError (" matrix is not symmetric; cannot convert to SymTridiagonal" ))
119119 end
120120end
121121
122+ _checksymmetric (d, du, dl) = all (((x, y),) -> x == transpose (y), zip (du, dl)) && all (issymmetric, d)
123+ _checksymmetric (A:: AbstractMatrix ) = _checksymmetric (diagview (A), diagview (A, 1 ), diagview (A, - 1 ))
124+
122125SymTridiagonal {T,V} (S:: SymTridiagonal{T,V} ) where {T,V<: AbstractVector{T} } = S
123126SymTridiagonal {T,V} (S:: SymTridiagonal ) where {T,V<: AbstractVector{T} } =
124127 SymTridiagonal (convert (V, S. dv):: V , convert (V, S. ev):: V )
@@ -128,6 +131,11 @@ SymTridiagonal{T}(S::SymTridiagonal) where {T} =
128131 convert (AbstractVector{T}, S. ev):: AbstractVector{T} )
129132SymTridiagonal (S:: SymTridiagonal ) = S
130133
134+ function convert (:: Type{T} , A:: AbstractMatrix ) where T<: SymTridiagonal
135+ checksquare (A)
136+ _checksymmetric (A) && isbanded (A, - 1 , 1 ) ? T (A) : throw (InexactError (:convert , T, A))
137+ end
138+
131139AbstractMatrix {T} (S:: SymTridiagonal ) where {T} = SymTridiagonal {T} (S)
132140AbstractMatrix {T} (S:: SymTridiagonal{T} ) where {T} = copy (S)
133141
@@ -597,7 +605,7 @@ julia> Tridiagonal(A)
597605 ⋅ ⋅ 3 4
598606```
599607"""
600- Tridiagonal ( A:: AbstractMatrix ) = Tridiagonal (diag (A,- 1 ), diag (A,0 ), diag (A,1 ))
608+ ( :: Type{Tri} )( A:: AbstractMatrix ) where {Tri <: Tridiagonal } = Tri (diag (A,- 1 ), diag (A,0 ), diag (A,1 ))
601609
602610Tridiagonal (A:: Tridiagonal ) = A
603611Tridiagonal {T} (A:: Tridiagonal{T} ) where {T} = A
@@ -619,6 +627,11 @@ function Tridiagonal{T,V}(A::Tridiagonal) where {T,V<:AbstractVector{T}}
619627 end
620628end
621629
630+ function convert (:: Type{T} , A:: AbstractMatrix ) where T<: Tridiagonal
631+ checksquare (A)
632+ isbanded (A, - 1 , 1 ) ? T (A) : throw (InexactError (:convert , T, A))
633+ end
634+
622635size (M:: Tridiagonal ) = (n = length (M. d); (n, n))
623636axes (M:: Tridiagonal ) = (ax = axes (M. d,1 ); (ax, ax))
624637
0 commit comments