@@ -191,16 +191,17 @@ _eviter_transposed(M::SymTridiagonal) = (transpose(x) for x in _evview(M))
191191function diag (M:: SymTridiagonal , n:: Integer = 0 )
192192 # every branch call similar(..., ::Int) to make sure the
193193 # same vector type is returned independent of n
194- v = similar (M. dv, max (0 , length (M. dv)- abs (n)))
194+ dinds = diagind (M, n, IndexStyle (M))
195+ v = similar (M. dv, length (dinds))
195196 if n == 0
196197 return copyto! (v, _diagiter (M))
197198 elseif n == 1
198199 return copyto! (v, _evview (M))
199200 elseif n == - 1
200201 return copyto! (v, _eviter_transposed (M))
201202 else
202- for i in eachindex (v)
203- v[i] = M[BandIndex (n,i) ]
203+ for i in eachindex (v, dinds )
204+ v[i] = M[dinds[i] ]
204205 end
205206 end
206207 return v
@@ -662,15 +663,16 @@ issymmetric(S::Tridiagonal) = all(issymmetric, S.d) && all(Iterators.map((x, y)
662663function diag (M:: Tridiagonal , n:: Integer = 0 )
663664 # every branch call similar(..., ::Int) to make sure the
664665 # same vector type is returned independent of n
665- v = similar (M. d, max (0 , length (M. d)- abs (n)))
666+ dinds = diagind (M, n, IndexStyle (M))
667+ v = similar (M. d, length (dinds))
666668 if n == 0
667669 copyto! (v, M. d)
668670 elseif n == - 1
669671 copyto! (v, M. dl)
670672 elseif n == 1
671673 copyto! (v, M. du)
672674 elseif abs (n) <= size (M,1 )
673- for i in eachindex (v)
675+ for i in eachindex (v, dinds )
674676 v[i] = M[BandIndex (n,i)]
675677 end
676678 end
0 commit comments