Skip to content

Commit cef21b5

Browse files
dkarraschmforets
authored andcommitted
Fix eigvecs(:::SymTridiagonal) with longer off-diagonal vector (#40526)
Co-authored-by: Marcelo Forets <[email protected]> (cherry picked from commit 3428e88)
1 parent 6050fed commit cef21b5

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

stdlib/LinearAlgebra/src/lapack.jl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3830,7 +3830,7 @@ for (stev, stebz, stegr, stein, elty) in
38303830
eev = copy(ev)
38313831
eev[n] = zero($elty)
38323832
else
3833-
throw(DimensionMismatch("ev has length $(length(ev)) but should be either $(length(dv) - 1) or $(length(dv))"))
3833+
throw(DimensionMismatch("ev has length $ne but needs one less than or equal to dv's length, $n)"))
38343834
end
38353835

38363836
abstol = Vector{$elty}(undef, 1)
@@ -3873,10 +3873,15 @@ for (stev, stebz, stegr, stein, elty) in
38733873
require_one_based_indexing(dv, ev_in, w_in, iblock_in, isplit_in)
38743874
chkstride1(dv, ev_in, w_in, iblock_in, isplit_in)
38753875
n = length(dv)
3876-
if length(ev_in) != n - 1
3877-
throw(DimensionMismatch("ev_in has length $(length(ev_in)) but needs one less than dv's length, $n)"))
3876+
ne = length(ev_in)
3877+
if ne == n - 1
3878+
ev = [ev_in; zero($elty)]
3879+
elseif ne == n
3880+
ev = copy(ev_in)
3881+
ev[n] = zero($elty)
3882+
else
3883+
throw(DimensionMismatch("ev_in has length $ne but needs one less than or equal to dv's length, $n)"))
38783884
end
3879-
ev = [ev_in; zeros($elty,1)]
38803885
ldz = n #Leading dimension
38813886
#Number of eigenvalues to find
38823887
if !(1 <= length(w_in) <= n)

stdlib/LinearAlgebra/test/lapack.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ end
410410
@test_throws DimensionMismatch LAPACK.stev!('U',d,rand(elty,10))
411411
@test_throws DimensionMismatch LAPACK.stebz!('A','B',zero(elty),zero(elty),0,0,-1.,d,rand(elty,10))
412412
@test_throws DimensionMismatch LAPACK.stegr!('N','A',d,rand(elty,11),zero(elty),zero(elty),0,0)
413-
@test_throws DimensionMismatch LAPACK.stein!(d,zeros(elty,10),zeros(elty,10),zeros(BlasInt,10),zeros(BlasInt,10))
413+
@test_throws DimensionMismatch LAPACK.stein!(d,zeros(elty,11),zeros(elty,10),zeros(BlasInt,10),zeros(BlasInt,10))
414414
@test_throws DimensionMismatch LAPACK.stein!(d,e,zeros(elty,11),zeros(BlasInt,10),zeros(BlasInt,10))
415415
end
416416
end

stdlib/LinearAlgebra/test/tridiag.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,8 @@ end
585585
F2 = eigen(A2)
586586
test_approx_eq_modphase(F.vectors, F2.vectors)
587587
@test F.values F2.values
588+
@test eigvecs(A) eigvecs(A2)
589+
@test eigvecs(A, eigvals(A)[1:1]) eigvecs(A2, eigvals(A2)[1:1])
588590
end
589591

590592
end # module TestTridiagonal

0 commit comments

Comments
 (0)