LSEARCH.M
上传用户:sfyaiting
上传日期:2009-10-25
资源大小:320k
文件大小:5k
源码类别:

GPS编程

开发平台:

Matlab

  1. function [afixed,sqnorm,ierr] = lsearch (afloat,L,D,Chi2,ncands)
  2. %LSEARCH: Integer ambiguity resolution, search
  3. %
  4. % This routine finds the integer vector which is closest to a given
  5. % float vector, in a least squares sence. This is the search-step in
  6. % integer ambiguity resolution. It is best to perform this search only
  7. % on ambiguities which have been decorrelated using LAMBDA.
  8. %
  9. % Input arguments:
  10. %    afloat : Float ambiguities (hat{a})
  11. %    L      : LtDL-decomposition of the decorrelated 
  12. %    D        variance-covariance matrix of the ambiguities
  13. %    Chi2   : Size of the search ellipsoid
  14. %    ncands : Number of requested candidates
  15. %
  16. % Output arguments:
  17. %    afixed : Estimated integers (matrix)
  18. %    sqnorm : Corresponding squared norms (vector, sorted)
  19. %    ierr   : Error code: 0: No errors found
  20. %                         1: Not enough candidates found
  21. % ----------------------------------------------------------------------
  22. % File.....: lsearch.m
  23. % Date.....: 19-MAY-1999
  24. % Author...: Peter Joosten
  25. %            Mathematical Geodesy and Positioning
  26. %            Delft University of Technology
  27. % ----------------------------------------------------------------------
  28. % -------------------------------
  29. % --- Initializing statements ---
  30. % -------------------------------
  31. Linv      = inv(L);
  32. Dinv      = 1./D;
  33. True      = 1;
  34. False     = 0;
  35. n         = max(size(afloat));
  36. right     = [zeros(n,1) ; Chi2];
  37. left      = [zeros(n+1,1)];
  38. dq        = [Dinv(2:n)./Dinv(1:n-1) 1/Dinv(n)];
  39. cand_n    = False;
  40. c_stop    = False;
  41. endsearch = False;
  42. ncan      = 0;
  43. i         = n + 1;
  44. iold      = i;
  45. ierr      = 0;
  46. afixed = zeros(n,ncands);
  47. sqnorm = zeros(1,ncands);
  48. % ----------------------------------
  49. % --- Start the main search-loop ---
  50. % ----------------------------------
  51. while ~ (endsearch);
  52.    i = i - 1;
  53.    if iold <= i
  54.       lef(i) = lef(i) + Linv(i+1,i);
  55.    else
  56.       lef(i) = 0;
  57.       for j = i+1:n;
  58.          lef(i) = lef(i) + Linv(j,i)*dist(j,1);
  59.       end;
  60.    end;
  61.    iold = i;
  62.    
  63.    right(i)  = (right(i+1) - left(i+1)) * dq(i);
  64.    reach     = sqrt(right(i));
  65.    delta     = afloat(i) - reach - lef(i);
  66.    dist(i,1) = ceil(delta) - afloat(i);
  67.    
  68.    if dist(i,1) > reach - lef(i)
  69. %     ----------------------------------------------------
  70. %     --- There is nothing at this level, so backtrack ---
  71. %     ----------------------------------------------------
  72.       cand_n = False;
  73.       c_stop = False;
  74.       
  75.       while (~ c_stop) & (i < n);
  76.       
  77.          i = i + 1;
  78.          if dist(i) < endd(i);
  79.             dist(i) = dist(i) + 1;
  80.             left(i) = (dist(i) + lef(i)) ^ 2;
  81.             c_stop = True;
  82.             if i == n; cand_n = True; end;
  83.          end;
  84.       
  85.       end;
  86.       
  87.       if (i == n) & (~ cand_n); endsearch = True; end;
  88.       
  89.    else
  90. %     ----------------------------
  91. %     --- Set the right border ---
  92. %     ----------------------------
  93.       endd(i) = reach - lef(i) - 1;
  94.       left(i) = (dist(i,1) + lef(i)) ^ 2;
  95.    end
  96.    if i == 1;
  97.    
  98. %     -------------------------------------------------------------------
  99. %     --- Collect the integer vectors and corresponding               ---
  100. %     --- squared distances, add to vectors "afixed" and "sqnorm" if: ---                             ---
  101. %     --- * Less then "ncands" candidates found so far                ---
  102. %     --- * The squared norm is smaller than one of the previous ones ---
  103. %     -------------------------------------------------------------------
  104.       t       = Chi2 - (right(1)-left(1)) * Dinv(1);
  105.       endd(1) = endd(1) + 1;
  106.       
  107.       while dist(1) <= endd(1);
  108.          if ncan < ncands;
  109.          
  110.             ncan             = ncan + 1;
  111.             afixed(1:n,ncan) = dist + afloat;
  112.             sqnorm(ncan)     = t;
  113.          else
  114.          
  115.             [maxnorm,ipos] = max(sqnorm);
  116.             if t < maxnorm;
  117.                afixed(1:n,ipos) = dist + afloat;
  118.                sqnorm(ipos)     = t;
  119.             end;
  120.             
  121.          end;
  122.          t       = t + (2 * (dist(1) + lef(1)) + 1) * Dinv(1);
  123.          dist(1) = dist(1) + 1;
  124.       end;
  125.       
  126. %     -------------------------
  127. %     --- And backtrack ... ---
  128. %     -------------------------
  129.       cand_n = False;
  130.       c_stop = False;
  131.       
  132.       while (~ c_stop) & (i < n);
  133.          i = i + 1;
  134.          if dist(i) < endd(i);
  135.             dist(i) = dist(i) + 1;
  136.             left(i) = (dist(i) + lef(i)) ^ 2;
  137.             c_stop = True;
  138.             if i == n; cand_n = True; end;
  139.          end;
  140.       
  141.       end;
  142.       if (i == n) & (~ cand_n); endsearch = True; end;
  143.       
  144.    end;
  145. end;
  146. % ----------------------------------------------------------------------
  147. % --- Sort the resulting candidates, according to the norm
  148. % ----------------------------------------------------------------------
  149. tmp    = sortrows ([sqnorm' afixed']);
  150. sqnorm = tmp(:,1)';
  151. afixed = tmp(:,2:n+1)';
  152. % ------------------------
  153. % --- Check for errors ---
  154. % ------------------------
  155. if ncan < ncands; ierr = 1; end;
  156. % ----------------------------------------------------------------------
  157. % End of routine: lsearch
  158. % ----------------------------------------------------------------------