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

波变换

开发平台:

Matlab

  1. function y = wkeep(x,varargin)
  2. %WKEEP  Keep part of a vector or a matrix.
  3. %   For a vector:
  4. %   Y = WKEEP(X,L,OPT) extracts the vector Y 
  5. %   from the vector X. The length of Y is L.
  6. %   If OPT = 'c' ('l' , 'r', respectively), Y is the central
  7. %   (left, right, respectively) part of X.
  8. %   Y = WKEEP(X,L,FIRST) returns the vector X(FIRST:FIRST+L-1).
  9. %
  10. %   Y = WKEEP(X,L) is equivalent to Y = WKEEP(X,L,'c').
  11. %
  12. %   For a matrix:
  13. %   Y = WKEEP(X,S) extracts the central part of the matrix X. 
  14. %   S is the size of Y.
  15. %   Y = WKEEP(X,S,[FIRSTR,FIRSTC]) extracts the submatrix of 
  16. %   matrix X, of size S and starting from X(FIRSTR,FIRSTC).
  17. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-May-96.
  18. %   Last Revision: 22-May-2003.
  19. %   Copyright 1995-2004 The MathWorks, Inc.
  20. % $Revision: 1.14.4.2 $
  21. % Check arguments.
  22. nbIn = nargin;
  23. if nbIn < 2
  24.   error('Not enough input arguments.');
  25. elseif nbIn > 4
  26.   error('Too many input arguments.');
  27. end
  28. y = x;
  29. sizeKept = varargin{1}(:)';
  30. nbDIM = length(sizeKept);
  31. if nbDIM<=1
  32.     sx = length(x);
  33.     [first,last,ok] = GetFirstLast(sx,nbDIM,varargin{:});
  34.     if ok , y = y(first(1):last(1)); end
  35. else
  36.     sx = size(x);  
  37.     [first,last,ok] = GetFirstLast(sx,nbDIM,varargin{:});
  38.     if ok , y = y(first(1):last(1),first(2):last(2)); end
  39. end
  40. %----------------------------------------------------------------------------%
  41. %Internal Function(s)
  42. %----------------------------------------------------------------------------%
  43. function [first,last,ok] = GetFirstLast(sx,nbDIM,varargin)
  44. begInd = ones(1,nbDIM);
  45. oneDIM = isequal(begInd,1);
  46. s = varargin{1}(:)';
  47. if ~oneDIM
  48.     K  = find(s>sx);
  49.     s(K) = sx(K);
  50.     ok = ~(any(s < 0) || (any(s~=fix(s))));
  51. else
  52.     ok = (s>=0) && (s<sx) && (s == fix(s));
  53. end
  54. if ok==0 , first = begInd; last = s; return; end
  55. nbarg = length(varargin);
  56. if nbarg<2, o = 'c'; else , o = lower(varargin{2}); end
  57. err = 0;
  58. if ischar(o(1))
  59.     switch o(1)
  60.         case 'c'
  61.             d = (sx-s)/2;
  62.             if nbarg<3
  63.                 if length(o)>1 , side = o(2:end); else , side = 'l'; end
  64.             else
  65.                 side = varargin{3};
  66.             end
  67.             if oneDIM
  68.                 [first,last] = GetFirst1D(side,sx,d);
  69.             else
  70.                 if length(side)<2 , side(2) = 0; end
  71.                 for k = 1:2
  72.                     [first(k),last(k)] = GetFirst1D(side(k),sx(k),d(k));
  73.                 end
  74.             end
  75.         case {'l','u'} , first = begInd; last = s;
  76.         case {'r','d'} , first = sx-s+1; last = sx;
  77.         otherwise      , err = 1;
  78.     end
  79. else
  80.     first = o; last = first+s-1;
  81.     if ~isequal(first,fix(first)) || any(first<1) || any(last>sx)
  82.         err = 1;
  83.     end
  84. end
  85. if err
  86.     errargt(mfilename,'invalid argument','msg');
  87.     error('*');
  88. end
  89. %----------------------------------------------------------------------------%
  90. function [first,last] = GetFirst1D(side,s,d)
  91. switch side
  92.   case {'u','l','0',0} , first = 1+floor(d); last = s-ceil(d);
  93.   case {'d','r','1',1} , first = 1+ceil(d);  last = s-floor(d);
  94.   otherwise    , first = 1+floor(d); last = s-ceil(d);  % Default is left side
  95. end
  96. %----------------------------------------------------------------------------%