# HG changeset patch # User John W. Eaton # Date 1296241559 18000 # Node ID 52f6f2989fcd2dce5b38fb8cc991fa003ef34660 # Parent 3d38b4916cbf8a9652ddc14870c8fe59e6cc909c don't let uninitialized values escape from DNEUPD diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,9 @@ +2011-01-28 John W. Eaton + + * eigs-base.cc (EigsRealNonSymmetricFunc, + EigsRealNonSymmetricMatrix, EigsRealNonSymmetricMatrixShift): + Initialize eig_vec2 to 0 before calling dneupd. + 2011-01-28 John W. Eaton * eigs-base.cc: Assume we have ARPACK. diff --git a/liboctave/eigs-base.cc b/liboctave/eigs-base.cc --- a/liboctave/eigs-base.cc +++ b/liboctave/eigs-base.cc @@ -1924,7 +1924,14 @@ Array s (dim_vector (p, 1)); octave_idx_type *sel = s.fortran_vec (); - Matrix eig_vec2 (n, k + 1); + // FIXME -- initialize eig_vec2 to zero; apparently dneupd can skip + // the assignment to elements of Z that represent imaginary parts. + // Found with valgrind and + // + // A = [1,0,0,-1;0,1,0,0;0,0,1,0;0,0,2,1]; + // [vecs, vals, f] = eigs (A, 1) + + Matrix eig_vec2 (n, k + 1, 0.0); double *z = eig_vec2.fortran_vec (); OCTAVE_LOCAL_BUFFER (double, dr, k + 1); @@ -2303,7 +2310,14 @@ Array s (dim_vector (p, 1)); octave_idx_type *sel = s.fortran_vec (); - Matrix eig_vec2 (n, k + 1); + // FIXME -- initialize eig_vec2 to zero; apparently dneupd can skip + // the assignment to elements of Z that represent imaginary parts. + // Found with valgrind and + // + // A = [1,0,0,-1;0,1,0,0;0,0,1,0;0,0,2,1]; + // [vecs, vals, f] = eigs (A, 1) + + Matrix eig_vec2 (n, k + 1, 0.0); double *z = eig_vec2.fortran_vec (); OCTAVE_LOCAL_BUFFER (double, dr, k + 1); @@ -2608,7 +2622,14 @@ Array s (dim_vector (p, 1)); octave_idx_type *sel = s.fortran_vec (); - Matrix eig_vec2 (n, k + 1); + // FIXME -- initialize eig_vec2 to zero; apparently dneupd can skip + // the assignment to elements of Z that represent imaginary parts. + // Found with valgrind and + // + // A = [1,0,0,-1;0,1,0,0;0,0,1,0;0,0,2,1]; + // [vecs, vals, f] = eigs (A, 1) + + Matrix eig_vec2 (n, k + 1, 0.0); double *z = eig_vec2.fortran_vec (); OCTAVE_LOCAL_BUFFER (double, dr, k + 1);