euclidediv.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:4k
源码类别:

波变换

开发平台:

Matlab

  1. function DEC = euclidediv(A,B)
  2. %EUCLIDEDIV Euclidean Algorithm for Laurent polynomials.
  3. %   DEC = EUCLIDEDIV(A,B) returns a cell array of Laurent polynomials
  4. %   such that each row of DEC contains an euclidian division of A 
  5. %   by B: A = B*Q + R. Q is the quotient and R the remainder.
  6. %   For each j from 1 to size(DEC,1):   A = B*DEC{j,1} + DEC{j,2}
  7. %
  8. %   The cell array DEC contains at most four rows.
  9. %
  10. %   Example:
  11. %     A = laurpoly([1:4],0);
  12. %     B = laurpoly([1 2],0);
  13. %     DEC = euclidediv(A,B);
  14. %     -------------------------------------------------------------------
  15. %     A(z) = 1 + 2*z^(-1) + 3*z^(-2) + 4*z^(-3) and  
  16. %     B(z) = 1 + 2*z^(-1)
  17. %     There are four decomposition A = B*Q + R: 
  18. %       Q(z) = 1 + 3*z^(-2)                  and  R(z) = - 2*z^(-3)
  19. %       Q(z) = 1 + 2*z^(-2)                  and  R(z) = z^(-2)
  20. %       Q(z) = 1 + 0.5*z^(-1) + 2*z^(-2)     and  R(z) = - 0.5*z^(-1)
  21. %       Q(z) = 0.75 + 0.5*z^(-1) + 2*z^(-2)  and  R(z) = 0.25
  22. %    --------------------------------------------------------------------- 
  23. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 20-Mar-2001.
  24. %   Last Revision 13-Jun-2003.
  25. %   Copyright 1995-2004 The MathWorks, Inc.
  26. %   $Revision: 1.1.6.2 $ $Date: 2004/04/13 00:38:40 $ 
  27. if      isnumeric(A) && length(A)==1 , A = laurpoly(A,0);
  28. elseif  isnumeric(B) && length(B)==1 , B = laurpoly(B,0);
  29. end
  30. maxDEG_A = A.maxDEG;
  31. maxDEG_B = B.maxDEG;
  32. cA = A.coefs; lA = length(cA);
  33. cB = B.coefs; lB = length(cB);
  34. minDEG_A = maxDEG_A-lA+1;
  35. minDEG_B = maxDEG_B-lB+1;
  36. maxDEG_LEFT  = maxDEG_A-maxDEG_B;
  37. minDEG_RIGHT = minDEG_A-minDEG_B;
  38. dL = lA-lB;
  39. if dL>0
  40.     rLEFT = cA;
  41.     qLEFT = [];
  42.     for j=1:dL+1
  43.         idxBEG = j;
  44.         idxEND = idxBEG+lB-1;
  45.         q = rLEFT(idxBEG)/cB(1);
  46.         if j==(dL+1)
  47.            qBIS = rLEFT(idxEND)/cB(end);
  48.            rLEFT_2 = rLEFT;
  49.            rLEFT_2(idxBEG:idxEND) = rLEFT_2(idxBEG:idxEND)-qBIS*cB;
  50.            qLEFT_2 = [qLEFT,qBIS];
  51.         end
  52.         qLEFT = [qLEFT q];        
  53.         rLEFT(idxBEG:idxEND) = rLEFT(idxBEG:idxEND)-q*cB;
  54.     end
  55.     rRIGHT = cA;
  56.     qRIGHT = [];
  57.     for j=1:dL+1
  58.         idxEND = lA-j+1;
  59.         idxBEG = idxEND-lB+1;
  60.         q = rRIGHT(idxEND)/cB(end);
  61.         if j==(dL+1)
  62.            qBIS = rRIGHT(idxBEG)/cB(1);
  63.            rRIGHT_2 = rRIGHT;
  64.            rRIGHT_2(idxBEG:idxEND) = rRIGHT_2(idxBEG:idxEND)-qBIS*cB;
  65.            qRIGHT_2 = [qBIS,qRIGHT];
  66.         end
  67.         qRIGHT = [q qRIGHT];
  68.         rRIGHT(idxBEG:idxEND) = rRIGHT(idxBEG:idxEND)-q*cB;
  69.     end
  70.     maxDEG_RIGHT = minDEG_RIGHT+length(qRIGHT)-1;
  71.     DEC = {...
  72.         laurpoly(qLEFT,maxDEG_LEFT)     , laurpoly(rLEFT,maxDEG_A);   ...
  73.         laurpoly(qLEFT_2,maxDEG_LEFT)   , laurpoly(rLEFT_2,maxDEG_A); ...
  74.         laurpoly(qRIGHT_2,maxDEG_LEFT)  , laurpoly(rRIGHT_2,maxDEG_A); ...
  75.         laurpoly(qRIGHT,maxDEG_RIGHT)   , laurpoly(rRIGHT,maxDEG_A) ...
  76.         };
  77. elseif dL==0
  78.     qLEFT  = cA(1)/cB(1);
  79.     qRIGHT = cA(end)/cB(end);
  80.     rLEFT  = cA-qLEFT*cB;
  81.     rRIGHT = cA-qRIGHT*cB;
  82.     maxDEG_RIGHT = minDEG_RIGHT;    
  83.     DEC = {...
  84.         laurpoly(qLEFT,maxDEG_LEFT)   , laurpoly(rLEFT,maxDEG_A);   ...
  85.         laurpoly(qRIGHT,maxDEG_RIGHT) , laurpoly(rRIGHT,maxDEG_A) ...
  86.         };
  87. else
  88.     Q = laurpoly(0,0);
  89.     R = A;
  90.     DEC = {laurpoly(0,0),A};
  91. end
  92. nbDEC = size(DEC,1);
  93. idx = logical(ones(1,nbDEC));
  94. for j=1:nbDEC
  95.     for k=j+1:nbDEC
  96.         if idx(k)==1
  97.             idx(k) = (DEC{j,1} ~= DEC{k,1}) | (DEC{j,2} ~= DEC{k,2});
  98.         end
  99.     end
  100. end
  101. DEC = DEC(idx,:);