annotate toolboxes/FullBNT-1.0.7/netlab3.3/eigdec.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function [evals, evec] = eigdec(x, N)
Daniel@0 2 %EIGDEC Sorted eigendecomposition
Daniel@0 3 %
Daniel@0 4 % Description
Daniel@0 5 % EVALS = EIGDEC(X, N computes the largest N eigenvalues of the
Daniel@0 6 % matrix X in descending order. [EVALS, EVEC] = EIGDEC(X, N) also
Daniel@0 7 % computes the corresponding eigenvectors.
Daniel@0 8 %
Daniel@0 9 % See also
Daniel@0 10 % PCA, PPCA
Daniel@0 11 %
Daniel@0 12
Daniel@0 13 % Copyright (c) Ian T Nabney (1996-2001)
Daniel@0 14
Daniel@0 15 if nargout == 1
Daniel@0 16 evals_only = logical(1);
Daniel@0 17 else
Daniel@0 18 evals_only = logical(0);
Daniel@0 19 end
Daniel@0 20
Daniel@0 21 if N ~= round(N) | N < 1 | N > size(x, 2)
Daniel@0 22 error('Number of PCs must be integer, >0, < dim');
Daniel@0 23 end
Daniel@0 24
Daniel@0 25 % Find the eigenvalues of the data covariance matrix
Daniel@0 26 if evals_only
Daniel@0 27 % Use eig function as always more efficient than eigs here
Daniel@0 28 temp_evals = eig(x);
Daniel@0 29 else
Daniel@0 30 % Use eig function unless fraction of eigenvalues required is tiny
Daniel@0 31 if (N/size(x, 2)) > 0.04
Daniel@0 32 [temp_evec, temp_evals] = eig(x);
Daniel@0 33 else
Daniel@0 34 options.disp = 0;
Daniel@0 35 [temp_evec, temp_evals] = eigs(x, N, 'LM', options);
Daniel@0 36 end
Daniel@0 37 temp_evals = diag(temp_evals);
Daniel@0 38 end
Daniel@0 39
Daniel@0 40 % Eigenvalues nearly always returned in descending order, but just
Daniel@0 41 % to make sure.....
Daniel@0 42 [evals perm] = sort(-temp_evals);
Daniel@0 43 evals = -evals(1:N);
Daniel@0 44 if ~evals_only
Daniel@0 45 if evals == temp_evals(1:N)
Daniel@0 46 % Originals were in order
Daniel@0 47 evec = temp_evec(:, 1:N);
Daniel@0 48 return
Daniel@0 49 else
Daniel@0 50 % Need to reorder the eigenvectors
Daniel@0 51 for i=1:N
Daniel@0 52 evec(:,i) = temp_evec(:,perm(i));
Daniel@0 53 end
Daniel@0 54 end
Daniel@0 55 end