@@ -125,17 +125,13 @@ AbstractMatrix{T}(S::SymTridiagonal) where {T} =
125
125
function Matrix {T} (M:: SymTridiagonal ) where T
126
126
n = size (M, 1 )
127
127
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]
138
133
end
134
+ Mf[n,n] = symmetric (M. dv[n], :U )
139
135
return Mf
140
136
end
141
137
Matrix (M:: SymTridiagonal{T} ) where {T} = Matrix {T} (M)
@@ -612,8 +608,8 @@ transpose(S::Tridiagonal{<:Number}) = Tridiagonal(S.du, S.d, S.dl)
612
608
Base. copy (aS:: Adjoint{<:Any,<:Tridiagonal} ) = (S = aS. parent; Tridiagonal (map (x -> copy .(adjoint .(x)), (S. du, S. d, S. dl))... ))
613
609
Base. copy (tS:: Transpose{<:Any,<:Tridiagonal} ) = (S = tS. parent; Tridiagonal (map (x -> copy .(transpose .(x)), (S. du, S. d, S. dl))... ))
614
610
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))
617
613
618
614
\ (A:: Adjoint{<:Any,<:Tridiagonal} , B:: Adjoint{<:Any,<:StridedVecOrMat} ) = copy (A) \ B
619
615
744
740
\ (B:: Number , A:: Tridiagonal ) = Tridiagonal (B\ A. dl, B\ A. d, B\ A. du)
745
741
746
742
== (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
749
749
750
750
det (A:: Tridiagonal ) = det_usmani (A. dl, A. d, A. du)
751
751
@@ -760,7 +760,10 @@ function SymTridiagonal{T}(M::Tridiagonal) where T
760
760
end
761
761
762
762
Base. _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
764
767
765
768
function Base. _sum (A:: Tridiagonal , dims:: Integer )
766
769
res = Base. reducedim_initarray (A, dims, zero (eltype (A)))
@@ -807,24 +810,24 @@ function Base._sum(A::SymTridiagonal, dims::Integer)
807
810
end
808
811
@inbounds begin
809
812
if dims == 1
810
- res[1 ] = A. ev[1 ] + A. dv[1 ]
813
+ res[1 ] = transpose ( A. ev[1 ]) + symmetric ( A. dv[1 ], :U )
811
814
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 ]
813
816
end
814
- res[n] = A. dv[n] + A. ev[n- 1 ]
817
+ res[n] = symmetric ( A. dv[n], :U ) + A. ev[n- 1 ]
815
818
elseif dims == 2
816
- res[1 ] = A. dv[1 ] + A. ev[1 ]
819
+ res[1 ] = symmetric ( A. dv[1 ], :U ) + A. ev[1 ]
817
820
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]
819
822
end
820
- res[n] = A. ev[n- 1 ] + A. dv[n]
823
+ res[n] = transpose ( A. ev[n- 1 ]) + symmetric ( A. dv[n], :U )
821
824
elseif dims >= 3
822
825
for i = 1 : n- 1
823
826
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])
826
829
end
827
- res[n,n] = A. dv[n]
830
+ res[n,n] = symmetric ( A. dv[n], :U )
828
831
end
829
832
end
830
833
res
0 commit comments