home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / maths / rlab / controls / CTB / esort < prev    next >
Text File  |  1995-11-15  |  1KB  |  58 lines

  1. //------------------------------------------------------------------------------
  2. //
  3. // esort
  4. //
  5. // Syntax: a=esort(p)
  6. //
  7. // This routine sorts the complex continuous eigenvalues in descending
  8. // order. It sorts based on the real part. The unstable eigenvalues (positive
  9. // real part) will appear first.
  10. //
  11. // The routine passes back the sorted eigenvalues and the cooresponding
  12. // indices in a list:
  13. //
  14. //    a.s  = sorted eigenvalues
  15. //    a.ndx = index
  16. //
  17. // Version JBL 940917
  18. //------------------------------------------------------------------------------
  19.  
  20. esort = function(p)
  21. {
  22.    local(s,ndx,i,k,swap,a,ic,j)
  23.  
  24.    if (p.nr == 1) {
  25.        p=p.';
  26.    }
  27.  
  28.    a=sort(-real(p));
  29.    s=a.val;
  30.    ndx=a.ind';
  31.  
  32.    for (i in 1:p.nc) {
  33.         ic=ndx[;i];
  34.         for (j in 1:p.nr) {
  35.              s[j;i]=p[ndx[j;i];i];
  36.         }
  37.    }
  38.  
  39.    for (i in 1:p.nc) {
  40.         k=1;
  41.         while (k < p.nr) {
  42.                if (imag(s[k;i]) != 0) {
  43.                    if (imag(s[k;i]) < 0) {
  44.                        s[k:k+1;i]=conj(s[k:k+1;i]);
  45.                        swap=ndx[k;i];
  46.                        ndx[k;i]=ndx[k+1;i];
  47.                        ndx[k+1;i]=swap;
  48.                    }
  49.                    k=k+2;
  50.                else
  51.                    k=k+1;
  52.                }
  53.         }
  54.    }
  55.  
  56.    return << s=s; ndx=ndx >>
  57. };
  58.