@@ -103,8 +103,12 @@ julia> SymTridiagonal(B)
103
103
```
104
104
"""
105
105
function SymTridiagonal (A:: AbstractMatrix )
106
- if (diag (A, 1 ) == transpose .(diag (A, - 1 ))) && all (issymmetric .(diag (A, 0 )))
107
- SymTridiagonal (diag (A, 0 ), diag (A, 1 ))
106
+ checksquare (A)
107
+ du = diag (A, 1 )
108
+ d = diag (A)
109
+ dl = diag (A, - 1 )
110
+ if all (((x, y),) -> x == transpose (y), zip (du, dl)) && all (issymmetric, d)
111
+ SymTridiagonal (d, du)
108
112
else
109
113
throw (ArgumentError (" matrix is not symmetric; cannot convert to SymTridiagonal" ))
110
114
end
@@ -116,12 +120,12 @@ SymTridiagonal{T,V}(S::SymTridiagonal) where {T,V<:AbstractVector{T}} =
116
120
SymTridiagonal {T} (S:: SymTridiagonal{T} ) where {T} = S
117
121
SymTridiagonal {T} (S:: SymTridiagonal ) where {T} =
118
122
SymTridiagonal (convert (AbstractVector{T}, S. dv):: AbstractVector{T} ,
119
- convert (AbstractVector{T}, S. ev):: AbstractVector{T} )
123
+ convert (AbstractVector{T}, S. ev):: AbstractVector{T} )
120
124
SymTridiagonal (S:: SymTridiagonal ) = S
121
125
122
- AbstractMatrix {T} (S:: SymTridiagonal ) where {T} =
123
- SymTridiagonal ( convert (AbstractVector {T}, S . dv) :: AbstractVector {T},
124
- convert (AbstractVector{T}, S . ev) :: AbstractVector{T} )
126
+ AbstractMatrix {T} (S:: SymTridiagonal ) where {T} = SymTridiagonal {T} (S)
127
+ AbstractMatrix {T} (S :: SymTridiagonal {T}) where {T} = copy (S)
128
+
125
129
function Matrix {T} (M:: SymTridiagonal ) where T
126
130
n = size (M, 1 )
127
131
Mf = Matrix {T} (undef, n, n)
@@ -508,8 +512,8 @@ Tridiagonal(dl::V, d::V, du::V, du2::V) where {T,V<:AbstractVector{T}} = Tridiag
508
512
function Tridiagonal {T} (dl:: AbstractVector , d:: AbstractVector , du:: AbstractVector ) where {T}
509
513
Tridiagonal (map (x-> convert (AbstractVector{T}, x), (dl, d, du))... )
510
514
end
511
- function Tridiagonal {T,V} (A :: Tridiagonal ) where {T,V <: AbstractVector{T} }
512
- Tridiagonal {T,V} (A . dl, A . d, A . du )
515
+ function Tridiagonal {T} (dl :: AbstractVector , d :: AbstractVector , du :: AbstractVector , du2 :: AbstractVector ) where {T }
516
+ Tridiagonal ( map (x -> convert (AbstractVector{T}, x), ( dl, d, du, du2)) ... )
513
517
end
514
518
515
519
"""
@@ -540,12 +544,20 @@ Tridiagonal(A::AbstractMatrix) = Tridiagonal(diag(A,-1), diag(A,0), diag(A,1))
540
544
Tridiagonal (A:: Tridiagonal ) = A
541
545
Tridiagonal {T} (A:: Tridiagonal{T} ) where {T} = A
542
546
function Tridiagonal {T} (A:: Tridiagonal ) where {T}
543
- dl, d, du = map (x-> convert (AbstractVector{T}, x):: AbstractVector{T} ,
544
- (A. dl, A. d, A. du))
547
+ dl, d, du = map (x -> convert (AbstractVector{T}, x):: AbstractVector{T} , (A. dl, A. d, A. du))
548
+ if isdefined (A, :du2 )
549
+ Tridiagonal {T} (dl, d, du, convert (AbstractVector{T}, A. du2):: AbstractVector{T} )
550
+ else
551
+ Tridiagonal {T} (dl, d, du)
552
+ end
553
+ end
554
+ Tridiagonal {T,V} (A:: Tridiagonal{T,V} ) where {T,V<: AbstractVector{T} } = A
555
+ function Tridiagonal {T,V} (A:: Tridiagonal ) where {T,V<: AbstractVector{T} }
556
+ dl, d, du = map (x -> convert (V, x):: V , (A. dl, A. d, A. du))
545
557
if isdefined (A, :du2 )
546
- Tridiagonal (dl, d, du, convert (AbstractVector{T} , A. du2):: AbstractVector{T} )
558
+ Tridiagonal {T,V} (dl, d, du, convert (V , A. du2):: V )
547
559
else
548
- Tridiagonal (dl, d, du)
560
+ Tridiagonal {T,V} (dl, d, du)
549
561
end
550
562
end
551
563
763
775
det (A:: Tridiagonal ) = det_usmani (A. dl, A. d, A. du)
764
776
765
777
AbstractMatrix {T} (M:: Tridiagonal ) where {T} = Tridiagonal {T} (M)
778
+ AbstractMatrix {T} (M:: Tridiagonal{T} ) where {T} = copy (M)
766
779
Tridiagonal {T} (M:: SymTridiagonal{T} ) where {T} = Tridiagonal (M)
767
780
function SymTridiagonal {T} (M:: Tridiagonal ) where T
768
781
if issymmetric (M)
0 commit comments