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

波变换

开发平台:

Matlab

  1. function MatFACT = mftable(M,flagNoControl)
  2. %MFTABLE Matrix factorization table.
  3. %   MatFACT = MFTABLE(M) returns the factorizations 
  4. %   of the Laurent matrix M obtained via an euclidean
  5. %   division algorithm. MATFACT is a cell array such 
  6. %   that each cell contains a factorization of PM:
  7. %      PM = prod(MatFACT{j}{:}) for every j.
  8. %
  9. %   Each "elementary factor" F = MatFACT{j}{k} is of one
  10. %   of the two following form:
  11. %
  12. %            | 1     0 |            | 1     P |
  13. %            |         |            |         |
  14. %        F = |         |   or   F = |         |
  15. %            |         |            |         |
  16. %            | P     1 |            | 0     1 |
  17. %
  18. %   where P is a Laurent polynomial.
  19. %
  20. %   Example:
  21. %      [Hs,Gs,Ha,Ga] = wave2lp('db2');
  22. %      PM = ppm(Hs,Gs);
  23. %      disp(PM);
  24. %      MatFACT = mftable(PM);
  25. %      displmf(MatFACT{1});
  26. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 25-Apr-2001.
  27. %   Last Revision 30-Jun-2003.
  28. %   Copyright 1995-2004 The MathWorks, Inc.
  29. %   $Revision: 1.1.6.2 $ $Date: 2004/04/13 00:39:16 $ 
  30. switch nargin
  31.     case 1 , testTypeControl = 'mat';
  32.     case 2 , testTypeControl = 'none';
  33. end
  34. E_H = M.Matrix{1,1};
  35. O_H = M.Matrix{2,1};
  36. len_E_H = length(lp2num(E_H));
  37. R_E_H = mod(len_E_H,2);
  38. differ_deg = degree(E_H)-degree(O_H);
  39. MatFACT = {};
  40. switch R_E_H
  41.     case 0  % Even number of factors = length(FactorTAB) - 1
  42.         if differ_deg >= 0
  43.             [FactorTAB,minmaxTAB] = eucfacttab(E_H,O_H);
  44.             MatFACT = makeMatFact(FactorTAB,M,testTypeControl);
  45.         end
  46.     case 1  % Odd number of factors = length(FactorTAB) - 1
  47.         if differ_deg <= 0
  48.             [FactorTAB,minmaxTAB] = eucfacttab(O_H,E_H);
  49.             MatFACT = makeMatFact(FactorTAB,M,testTypeControl);
  50.         end
  51. end
  52. %------------------------------------------------------%
  53. % Number of Polynomial factors = length(FactorTAB) - 1 
  54. % R_E_H = 0  <==>  Even number of factors.
  55. % R_E_H = 1  <==>  Odd number of factors.
  56. %------------------------------------------------------%
  57. %========================================================================%
  58. function MatFACT = makeMatFact(FactorTAB,M,testTypeControl)
  59. %MAKEMATFACT Make matrix factorization.
  60. %   MatFACT = MAKEMATFACT(FactorTAB,M,testTypeControl)
  61. %   Computes all the factorizations for matrix M, using 
  62. %   the array of factors FactorTAB.
  63. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 30-May-2003.
  64. %   Last Revision: 21-Jun-2003.
  65. MatFACT = {};
  66. if isempty(FactorTAB) , return; end
  67. % Initialization.
  68. %----------------
  69. lenFACT = size(FactorTAB,2);
  70. remVAL  = mod(lenFACT-1,2);
  71. idxFACT = 0;
  72. % Suppress zeros factor.
  73. %-----------------------
  74. TMP_1 = laurmat(FactorTAB(:,1));
  75. TMP_2 = laurmat(zeros(size(FactorTAB,1),1));
  76. if TMP_1==TMP_2 
  77.     FactorTAB(:,1) = [];
  78.     remVAL = mod(lenFACT-1,2);
  79.     disp(sprintf('NewREM = %3.0f ',remVAL));
  80.     error('*** STOP ***')
  81. end
  82. clear TMP_1 TMP_2
  83. % Compute factorizations.
  84. %------------------------
  85. for idx = 1:size(FactorTAB,1)
  86.     FACT = FactorTAB(idx,:);
  87.     C    = laurmat({FACT{end},0;0,1/FACT{end}});
  88.     MF   = cell(1,lenFACT-1);
  89.     for k = 1:lenFACT-1
  90.         MF{k} = laurmat({1,FACT{k};0,1});
  91.         if mod(k,2)==remVAL , MF{k} = MF{k}'; end        
  92.     end
  93.     [OK,R] = ControlFACT(MF,C,M,testTypeControl);
  94.     if OK
  95.         if ~isempty(R) , MF{end+1} = R; end
  96.         MF{end+1} = C;
  97.         idxFACT = idxFACT+1;
  98.         MatFACT{idxFACT} = MF;
  99.     end
  100. end
  101. %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---%
  102. function [OK,R] = ControlFACT(MF,C,M,testTypeControl)
  103. OK = 1;
  104. R  = [];
  105. switch testTypeControl
  106. case 'none',
  107. otherwise
  108.     P0 = prod(MF{:}) * C;
  109.     D  = M - P0;
  110.     OK = (D.Matrix{1,1}==0 && D.Matrix{2,1}==0);
  111.     switch testTypeControl
  112.         case 'col' , R = [];
  113.         case 'mat'
  114.             
  115.             D1 = euclideDIV(D.Matrix{1,2},M.Matrix{1,1});
  116.             D2 = euclideDIV(D.Matrix{2,2},M.Matrix{2,1});
  117.             for i=1:size(D1,1)
  118.                 M_D1 = laurmat(D1(i,:));
  119.                 for j=1:size(D2,1)
  120.                     M_D2 = laurmat(D2(j,:));
  121.                     OK = (M_D1==M_D2) && D1{i,2}==0;
  122.                     if OK , break; end
  123.                 end
  124.                 if OK ,
  125.                     S = D1{i,1}*(C.Matrix{1,1}*C.Matrix{1,1});
  126.                     if S==0
  127.                         R = [];
  128.                     else
  129.                         R = laurmat({1,S;0,1});
  130.                     end
  131.                     break; 
  132.                 end
  133.             end
  134.     end
  135. end
  136. %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---%
  137. %========================================================================%