@@ -125,17 +125,13 @@ AbstractMatrix{T}(S::SymTridiagonal) where {T} =
125125function Matrix {T} (M:: SymTridiagonal ) where T
126126 n = size (M, 1 )
127127 Mf = zeros (T, n, n)
128- if n == 0
129- return Mf
130- end
131- @inbounds begin
132- @simd for i = 1 : n- 1
133- Mf[i,i] = M. dv[i]
134- Mf[i+ 1 ,i] = M. ev[i]
135- Mf[i,i+ 1 ] = M. ev[i]
136- end
137- Mf[n,n] = M. dv[n]
128+ n == 0 && return Mf
129+ @inbounds for i = 1 : n- 1
130+ Mf[i,i] = symmetric (M. dv[i], :U )
131+ Mf[i+ 1 ,i] = transpose (M. ev[i])
132+ Mf[i,i+ 1 ] = M. ev[i]
138133 end
134+ Mf[n,n] = symmetric (M. dv[n], :U )
139135 return Mf
140136end
141137Matrix (M:: SymTridiagonal{T} ) where {T} = Matrix {T} (M)
@@ -612,8 +608,8 @@ transpose(S::Tridiagonal{<:Number}) = Tridiagonal(S.du, S.d, S.dl)
612608Base. copy (aS:: Adjoint{<:Any,<:Tridiagonal} ) = (S = aS. parent; Tridiagonal (map (x -> copy .(adjoint .(x)), (S. du, S. d, S. dl))... ))
613609Base. copy (tS:: Transpose{<:Any,<:Tridiagonal} ) = (S = tS. parent; Tridiagonal (map (x -> copy .(transpose .(x)), (S. du, S. d, S. dl))... ))
614610
615- ishermitian (S:: Tridiagonal ) = isreal ( S. d) && S . du == adjoint .( S. dl)
616- issymmetric (S:: Tridiagonal ) = S . du == S . dl
611+ ishermitian (S:: Tridiagonal ) = all (ishermitian, S. d) && all (Iterators . map ((x, y) -> x == y ' , S . du, S. dl) )
612+ issymmetric (S:: Tridiagonal ) = all (issymmetric, S . d) && all (Iterators . map ((x, y) -> x == transpose (y), S . du, S . dl))
617613
618614\ (A:: Adjoint{<:Any,<:Tridiagonal} , B:: Adjoint{<:Any,<:StridedVecOrMat} ) = copy (A) \ B
619615
744740\ (B:: Number , A:: Tridiagonal ) = Tridiagonal (B\ A. dl, B\ A. d, B\ A. du)
745741
746742== (A:: Tridiagonal , B:: Tridiagonal ) = (A. dl== B. dl) && (A. d== B. d) && (A. du== B. du)
747- == (A:: Tridiagonal , B:: SymTridiagonal ) = (A. dl== A. du== B. ev) && (A. d== B. dv)
748- == (A:: SymTridiagonal , B:: Tridiagonal ) = (B. dl== B. du== A. ev) && (B. d== A. dv)
743+ function == (A:: Tridiagonal , B:: SymTridiagonal )
744+ iseq = all (Iterators. map ((x, y) -> x == transpose (y), A. du, A. dl))
745+ iseq = iseq && A. du == _evview (B)
746+ iseq && all (Iterators. map ((x, y) -> x == symmetric (y, :U ), A. d, B. dv))
747+ end
748+ == (A:: SymTridiagonal , B:: Tridiagonal ) = B == A
749749
750750det (A:: Tridiagonal ) = det_usmani (A. dl, A. d, A. du)
751751
@@ -760,7 +760,10 @@ function SymTridiagonal{T}(M::Tridiagonal) where T
760760end
761761
762762Base. _sum (A:: Tridiagonal , :: Colon ) = sum (A. d) + sum (A. dl) + sum (A. du)
763- Base. _sum (A:: SymTridiagonal , :: Colon ) = sum (A. dv) + 2 sum (A. ev)
763+ function Base. _sum (A:: SymTridiagonal , :: Colon )
764+ se = sum (_evview (A))
765+ symmetric (sum (A. dv), :U ) + se + transpose (se)
766+ end
764767
765768function Base. _sum (A:: Tridiagonal , dims:: Integer )
766769 res = Base. reducedim_initarray (A, dims, zero (eltype (A)))
@@ -807,24 +810,24 @@ function Base._sum(A::SymTridiagonal, dims::Integer)
807810 end
808811 @inbounds begin
809812 if dims == 1
810- res[1 ] = A. ev[1 ] + A. dv[1 ]
813+ res[1 ] = transpose ( A. ev[1 ]) + symmetric ( A. dv[1 ], :U )
811814 for i = 2 : n- 1
812- res[i] = A. ev[i] + A. dv[i] + A. ev[i- 1 ]
815+ res[i] = transpose ( A. ev[i]) + symmetric ( A. dv[i], :U ) + A. ev[i- 1 ]
813816 end
814- res[n] = A. dv[n] + A. ev[n- 1 ]
817+ res[n] = symmetric ( A. dv[n], :U ) + A. ev[n- 1 ]
815818 elseif dims == 2
816- res[1 ] = A. dv[1 ] + A. ev[1 ]
819+ res[1 ] = symmetric ( A. dv[1 ], :U ) + A. ev[1 ]
817820 for i = 2 : n- 1
818- res[i] = A. ev[i- 1 ] + A. dv[i] + A. ev[i]
821+ res[i] = transpose ( A. ev[i- 1 ]) + symmetric ( A. dv[i], :U ) + A. ev[i]
819822 end
820- res[n] = A. ev[n- 1 ] + A. dv[n]
823+ res[n] = transpose ( A. ev[n- 1 ]) + symmetric ( A. dv[n], :U )
821824 elseif dims >= 3
822825 for i = 1 : n- 1
823826 res[i,i+ 1 ] = A. ev[i]
824- res[i,i] = A. dv[i]
825- res[i+ 1 ,i] = A. ev[i]
827+ res[i,i] = symmetric ( A. dv[i], :U )
828+ res[i+ 1 ,i] = transpose ( A. ev[i])
826829 end
827- res[n,n] = A. dv[n]
830+ res[n,n] = symmetric ( A. dv[n], :U )
828831 end
829832 end
830833 res
0 commit comments