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

波变换

开发平台:

Matlab

  1. function y = wshift(type,x,p)
  2. %WSHIFT Shift Vector or Matrix.
  3. %   Y = WSHIFT(TYPE,X,P) with TYPE = {1,'1','1d' or '1D'}
  4. %   performs a P-circular shift of vector X.
  5. %   The shift P must be an integer, positive for right to left
  6. %   shift and negative for left to right shift.
  7. %
  8. %   Y = WSHIFT(TYPE,X,P) with TYPE = {2,'2','2d' or '2D'}
  9. %   performs a P-circular shift of matrix X.
  10. %   The shifts P must be integers. P(1) is the shift for rows
  11. %   and P(2) is the shift for columns.
  12. %
  13. %   WSHIFT('1D',X) is equivalent to WSHIFT('1D',X,1)
  14. %   WSHIFT('2D',X) is equivalent to WSHIFT('2D',X,[1 1])
  15. %
  16. %   Example 1D:
  17. %     x = [1 2 3 4 5]
  18. %     wshift('1D',x,1)  = [2 3 4 5 1]
  19. %     wshift('1D',x,-1) = [5 1 2 3 4]
  20. %
  21. %   Example 2D:
  22. %     x = [1 2 3;5 6 7]
  23. %     wshift('2D',x,[1 1])  = [6 7 5;2 3 1]
  24. %     wshift('2D',x,[-1,0]) = [5 6 7;1 2 3]
  25. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Dec-97.
  26. %   Last Revision: 01-May-1998.
  27. %   Copyright 1995-2004 The MathWorks, Inc.
  28. %   $Revision: 1.8.4.2 $  $Date: 2004/03/15 22:43:31 $
  29. if isempty(x) | all(p==0) , y = x; return; end
  30. switch type
  31.   case {1,'1','1d','1D'}
  32.     if nargin<3 , p = 1; end
  33.     L = length(x);
  34.     p = rem(p,L);
  35.     if p<0 , p = L+p; end
  36.     y = x([p+1:L,1:p]);
  37.   case {2,'2','2d','2D'}
  38.     if nargin<3 , p = [1 1]; end
  39.     S = size(x);
  40.     p = rem(p,S);
  41.     k = (p<0);
  42.     p(k) = S(k)+p(k);
  43.     y = x([p(1)+1:S(1),1:p(1)],[p(2)+1:S(2),1:p(2)]);
  44. end