@@ -122,17 +122,23 @@ SymTridiagonal(S::SymTridiagonal) = S
122
122
AbstractMatrix {T} (S:: SymTridiagonal ) where {T} =
123
123
SymTridiagonal (convert (AbstractVector{T}, S. dv):: AbstractVector{T} ,
124
124
convert (AbstractVector{T}, S. ev):: AbstractVector{T} )
125
- function Matrix {T} (M:: SymTridiagonal ) where T
125
+ Matrix {T} (M:: SymTridiagonal ) where {T} = copyto! (Matrix {T} (undef, size (M)), M)
126
+ function copyto! (A:: AbstractMatrix{T} , M:: SymTridiagonal ) where {T}
127
+ require_one_based_indexing (A)
126
128
n = size (M, 1 )
127
- Mf = zeros (T, n, 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]
129
+ n == 0 && return A
130
+ if size (A) == (n, n)
131
+ fill! (A, zero (T))
132
+ @inbounds for i in 1 : n- 1
133
+ A[i,i] = symmetric (M. dv[i], :U )
134
+ A[i+ 1 ,i] = transpose (M. ev[i])
135
+ A[i,i+ 1 ] = M. ev[i]
136
+ end
137
+ A[n,n] = symmetric (M. dv[n], :U )
138
+ return A
139
+ else
140
+ return @invoke copyto! (A:: AbstractMatrix , M:: AbstractMatrix )
133
141
end
134
- Mf[n,n] = symmetric (M. dv[n], :U )
135
- return Mf
136
142
end
137
143
Matrix (M:: SymTridiagonal{T} ) where {T} = Matrix {T} (M)
138
144
Array (M:: SymTridiagonal ) = Matrix (M)
@@ -571,16 +577,24 @@ function size(M::Tridiagonal, d::Integer)
571
577
end
572
578
end
573
579
574
- function Matrix {T} (M:: Tridiagonal{T} ) where T
575
- A = zeros (T, size (M))
576
- for i = 1 : length (M. d)
577
- A[i,i] = M. d[i]
578
- end
579
- for i = 1 : length (M. d)- 1
580
- A[i+ 1 ,i] = M. dl[i]
581
- A[i,i+ 1 ] = M. du[i]
580
+ Matrix {T} (M:: Tridiagonal ) where {T} = copyto! (Matrix {T} (undef, size (M)), M)
581
+
582
+ function copyto! (A:: AbstractMatrix{T} , M:: Tridiagonal ) where {T}
583
+ require_one_based_indexing (A)
584
+ n = size (M, 1 )
585
+ n == 0 && return A
586
+ if size (A) == (n, n)
587
+ fill! (A, zero (T))
588
+ @inbounds for i = 1 : n- 1
589
+ A[i,i] = M. d[i]
590
+ A[i+ 1 ,i] = M. dl[i]
591
+ A[i,i+ 1 ] = M. du[i]
592
+ end
593
+ A[n,n] = M. d[n]
594
+ return A
595
+ else
596
+ @invoke copyto! (A:: AbstractMatrix , M:: AbstractMatrix )
582
597
end
583
- A
584
598
end
585
599
Matrix (M:: Tridiagonal{T} ) where {T} = Matrix {T} (M)
586
600
Array (M:: Tridiagonal ) = Matrix (M)
0 commit comments