48 lines
1.2 KiB
Matlab
48 lines
1.2 KiB
Matlab
|
% [w,rts,lgroots] = SPEigensystem(a,uprbnd)
|
||
|
%
|
||
|
% Compute the roots and the left eigenvectors of the companion
|
||
|
% matrix, sort the roots from large-to-small, and sort the
|
||
|
% eigenvectors conformably. Map the eigenvectors into the real
|
||
|
% domain. Count the roots bigger than uprbnd.
|
||
|
|
||
|
function [w,rts,lgroots,flag_trouble] = SPEigensystem(a,uprbnd,rowsLeft)
|
||
|
opts.disp=0;
|
||
|
try
|
||
|
[w,d] = eigs(a',rowsLeft,'LM',opts);
|
||
|
rts = diag(d);
|
||
|
mag = abs(rts);
|
||
|
[mag,k] = sort(-mag);
|
||
|
rts = rts(k);
|
||
|
catch
|
||
|
%disp('Catch in SPE');
|
||
|
%pause(0.5);
|
||
|
%aStr=datestr(clock);
|
||
|
%eval(['save ' regexprep(aStr,' ','') ' a']);
|
||
|
try
|
||
|
[w,d]=eig(a');
|
||
|
catch
|
||
|
lasterr
|
||
|
w=[];rts=[];lgroots=[];
|
||
|
flag_trouble=1;
|
||
|
return
|
||
|
end
|
||
|
rts = diag(d);
|
||
|
mag = abs(rts);
|
||
|
[mag,k] = sort(-mag);
|
||
|
rts = rts(k);
|
||
|
end
|
||
|
flag_trouble=0;
|
||
|
|
||
|
ws=SPSparse(w);
|
||
|
ws = ws(:,k);
|
||
|
|
||
|
% Given a complex conjugate pair of vectors W = [w1,w2], there is a
|
||
|
% nonsingular matrix D such that W*D = real(W) + imag(W). That is to
|
||
|
% say, W and real(W)+imag(W) span the same subspace, which is all
|
||
|
% that aim cares about.
|
||
|
|
||
|
ws = real(ws) + imag(ws);
|
||
|
|
||
|
lgroots = sum(abs(rts) > uprbnd);
|
||
|
|
||
|
w=full(ws);
|