Mercurial > hg > octave-nkf
diff scripts/sparse/svds.m @ 14041:6cb6e390e58c stable
svds.m: Correctly restore random seed state after %!tests
* svds.m: Correctly restore random seed state after %!tests
author | Rik <octave@nomad.inbox5.com> |
---|---|
date | Mon, 12 Dec 2011 23:05:08 -0800 |
parents | e8564e8b0043 |
children | 72c96de7a403 |
line wrap: on
line diff
--- a/scripts/sparse/svds.m +++ b/scripts/sparse/svds.m @@ -241,46 +241,56 @@ endfunction -%!shared n, k, A, u, s, v, opts +%!shared n, k, A, u, s, v, opts, rand_state, randn_state %! n = 100; %! k = 7; -%! A = sparse([3:n,1:n,1:(n-2)],[1:(n-2),1:n,3:n],[ones(1,n-2),0.4*n*ones(1,n),ones(1,n-2)]); -%! [u,s,v] = svd(full(A)); -%! s = diag(s); -%! [~, idx] = sort(abs(s)); +%! A = sparse ([3:n,1:n,1:(n-2)],[1:(n-2),1:n,3:n],[ones(1,n-2),0.4*n*ones(1,n),ones(1,n-2)]); +%! [u,s,v] = svd (full (A)); +%! s = diag (s); +%! [~, idx] = sort (abs(s)); %! s = s(idx); -%! u = u(:,idx); -%! v = v(:,idx); -%! old_state1 = randn ("state"); -%! restore_state1 = onCleanup (@() randn ("state", old_state1)); -%! old_state2 = rand ("state"); -%! restore_state2 = onCleanup (@() rand ("state", old_state2)); -%! randn ('state', 42); % Initialize to make normest function reproducible -%! rand ('state', 42); +%! u = u(:, idx); +%! v = v(:, idx); +%! randn_state = randn ("state"); +%! rand_state = rand ("state"); +%! randn ("state", 42); % Initialize to make normest function reproducible +%! rand ("state", 42); %! opts.v0 = rand (2*n,1); % Initialize eigs ARPACK starting vector %! % to guarantee reproducible results +%! %!test -%! [u2,s2,v2,flag] = svds(A,k); -%! s2 = diag(s2); -%! assert(flag,!1); -%! assert(s2, s(end:-1:end-k+1), 1e-10); +%! [u2,s2,v2,flag] = svds (A,k); +%! s2 = diag (s2); +%! assert (flag, !1); +%! assert (s2, s(end:-1:end-k+1), 1e-10); +%! %!testif HAVE_UMFPACK -%! [u2,s2,v2,flag] = svds(A,k,0,opts); -%! s2 = diag(s2); -%! assert(flag,!1); -%! assert(s2, s(k:-1:1), 1e-10); +%! [u2,s2,v2,flag] = svds (A,k,0,opts); +%! s2 = diag (s2); +%! assert (flag, !1); +%! assert (s2, s(k:-1:1), 1e-10); +%! %!testif HAVE_UMFPACK %! idx = floor(n/2); %! % Don't put sigma right on a singular value or there are convergence issues %! sigma = 0.99*s(idx) + 0.01*s(idx+1); -%! [u2,s2,v2,flag] = svds(A,k,sigma,opts); -%! s2 = diag(s2); -%! assert(flag,!1); -%! assert(s2, s((idx+floor(k/2)):-1:(idx-floor(k/2))), 1e-10); +%! [u2,s2,v2,flag] = svds (A,k,sigma,opts); +%! s2 = diag (s2); +%! assert (flag, !1); +%! assert (s2, s((idx+floor(k/2)):-1:(idx-floor(k/2))), 1e-10); +%! %!test -%! [u2,s2,v2,flag] = svds(zeros (10), k); -%! assert (isequal(u2, eye (10, k)) && isequal (s2, zeros(k)) && isequal (v2, eye(10, 7))); +%! [u2,s2,v2,flag] = svds (zeros (10), k); +%! assert (u2, eye (10, k)); +%! assert (s2, zeros (k)); +%! assert (v2, eye (10, 7)); +%! %!test %! s = svds (speye (10)); %! assert (s, ones (6, 1), 2*eps); +%!test +%! ## Restore random number generator seeds at end of tests +%! rand ("state", rand_state); +%! randn ("state", randn_state); +