# HG changeset patch # User John W. Eaton # Date 1296115980 18000 # Node ID b84542512ae875370a81d1e4135d95993d0ef931 # Parent 9d8f94d28e3e9132b790f75a045d36dca7ee560f 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-27 John W. Eaton + + * eigs-base.cc (EigsRealNonSymmetricFunc, + EigsRealNonSymmetricMatrix, EigsRealNonSymmetricMatrixShift): + Initialize eig_vec2 to 0 before calling dneupd. + 2011-01-26 John W. Eaton * oct-refcount.h: Strip trailing whitespace. diff --git a/liboctave/eigs-base.cc b/liboctave/eigs-base.cc --- a/liboctave/eigs-base.cc +++ b/liboctave/eigs-base.cc @@ -1927,7 +1927,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); @@ -2306,7 +2313,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); @@ -2611,7 +2625,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);