


 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