


eigenshuffle: Consistent sorting for an eigenvalue/vector sequence
[Vseq,Dseq] = eigenshuffle(Asequence)
Includes munkres.m (by gracious permission from Yi Cao)
to choose the appropriate permutation. This greatly
enhances the speed of eigenshuffle over my previous
release.
http://www.mathworks.com/matlabcentral/fileexchange/20652
Arguments: (input)
Asequence - an array of eigenvalue problems. If
Asequence is a 3-d numeric array, then each
plane of Asequence must contain a square
matrix that will be used to call eig.
Eig will be called on each of these matrices
to produce a series of eigenvalues/vectors,
one such set for each eigenvalue problem.
Arguments: (Output)
Vseq - a 3-d array (pxpxn) of eigenvectors.
Dseq - pxn array of eigen values.
Idx - Permutation indices that sorts the eigenvalues and eigenvectors,
dimensions are (pxn). The ordering chosen will be one that
maximizes the energy of the consecutive eigensystems relative to
each other. The proper order:
Vseq(:,:,i) = Vseq(:,Idx(:,i),i);
Dseq(:,i) = Dseq(Idx(:,i),i);
Example:
Efun = @(t) [1 2*t+1 t^2 t^3;2*t+1 2-t t^2 1-t^3; ...
t^2 t^2 3-2*t t^2;t^3 1-t^3 t^2 4-3*t];
Aseq = zeros(4,4,21);
for i = 1:21
Aseq(:,:,i) = Efun((i-11)/10);
end
[Vseq,Dseq] = eigenshuffle(Aseq);
To see that eigenshuffle has done its work correctly,
look at the eigenvalues in sequence, after the shuffle.
t = (-1:.1:1)';
[t,Dseq']
ans =
-1 8.4535 5 2.3447 0.20181
-0.9 7.8121 4.7687 2.3728 0.44644
-0.8 7.2481 4.56 2.3413 0.65054
-0.7 6.7524 4.3648 2.2709 0.8118
-0.6 6.3156 4.1751 2.1857 0.92364
-0.5 5.9283 3.9855 2.1118 0.97445
-0.4 5.5816 3.7931 2.0727 0.95254
-0.3 5.2676 3.5976 2.0768 0.858
-0.2 4.9791 3.3995 2.1156 0.70581
-0.1 4.7109 3.2 2.1742 0.51494
0 4.4605 3 2.2391 0.30037
0.1 4.2302 2.8 2.2971 0.072689
0.2 4.0303 2.5997 2.3303 -0.16034
0.3 3.8817 2.4047 2.3064 -0.39272
0.4 3.8108 2.1464 2.2628 -0.62001
0.5 3.8302 1.8986 2.1111 -0.83992
0.6 3.9301 1.5937 1.9298 -1.0537
0.7 4.0927 1.2308 1.745 -1.2685
0.8 4.3042 0.82515 1.5729 -1.5023
0.9 4.5572 0.40389 1.4272 -1.7883
1 4.8482 -8.0012e-16 1.3273 -2.1755
Here, the columns are the shuffled eigenvalues.
See that the second eigenvalue goes to zero, but
the third eigenvalue remains positive. We can plot
eigenvalues and see that they have crossed, near
t = 0.35 in Efun.
plot(-1:.1:1,Dseq')
For a better appreciation of what eigenshuffle did,
compare the result of eig directly on Efun(.3) and
Efun(.4). Thus:
[V3,D3] = eig(Efun(.3))
V3 =
-0.74139 0.53464 -0.23551 0.3302
0.64781 0.4706 -0.16256 0.57659
0.0086542 -0.44236 -0.89119 0.10006
-0.17496 -0.54498 0.35197 0.74061
D3 =
-0.39272 0 0 0
0 2.3064 0 0
0 0 2.4047 0
0 0 0 3.8817
[V4,D4] = eig(Efun(.4))
V4 =
-0.73026 0.19752 0.49743 0.42459
0.66202 0.21373 0.35297 0.62567
0.013412 -0.95225 0.25513 0.16717
-0.16815 -0.092308 -0.75026 0.63271
D4 =
-0.62001 0 0 0
0 2.1464 0 0
0 0 2.2628 0
0 0 0 3.8108
With no sort or shuffle applied, look at V3(:,3). See
that it is really closest to V4(:,2), but with a sign
flip. Since the signs on the eigenvectors are arbitrary,
the sign is changed, and the most consistent sequence
will be chosen. By way of comparison, see how the
eigenvectors in Vseq have been shuffled, the signs
swapped appropriately.
Vseq(:,:,14)
ans =
0.3302 0.23551 -0.53464 0.74139
0.57659 0.16256 -0.4706 -0.64781
0.10006 0.89119 0.44236 -0.0086542
0.74061 -0.35197 0.54498 0.17496
Vseq(:,:,15)
ans =
0.42459 -0.19752 -0.49743 0.73026
0.62567 -0.21373 -0.35297 -0.66202
0.16717 0.95225 -0.25513 -0.013412
0.63271 0.092308 0.75026 0.16815
See also: eig
Author: John D'Errico
e-mail: woodchips@rochester.rr.com
Release: 3.0
Release date: 2/18/09