⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmrepeat.m

📁 《精通matlab7》“mastering matlab 7”的代码。
💻 M
字号:
function [y,m]=mmrepeat(x,n)
%MMREPEAT Repeat or Count Repeated Values in a Vector. (MM)
% MMREPEAT(X,N) returns a vector formed from X where X(i) is repeated
% N(i) times. If N is a scalar it is applied to all elements of X.
% N must contain nonnegative integers. N must be a scalar or have the same
% length as X.
%
% For example, MMREPEAT([1 2 3 4],[2 3 1 0]) returns the vector
% [1 1  2 2 2  3]    (extra spaces added for clarity)
%
% [X,N]=MMREPEAT(Y) counts the consecutive repeated values in Y returning
% the values in X and the counts in N. Y=MMREPEAT(X,N) and [X,N]=MMREPEAT(Y)
% are inverses of each other if N contains no zeros and X contains unique
% elements.
%
% See also MMSUBDIV.

% D.C. Hanselman, University of Maine, Orono, ME 04469
% 3/2/99, 4/14/99
% Mastering MATLAB 6, Prentice Hall, ISBN 0-13-019468-9

if nargin==2 % MMREPEAT(X,N)
   xlen=length(x);
   nlen=length(n);
   if ndims(x)~=2 || numel(x)~=xlen
      error('X Must be a Vector.')
   else
      [r,c]=size(x);
   end
   if any(n<0) || any(fix(n)~=n)
      error('N Must Contain NonNegative Integers.')
   end
   if ndims(n)~=2 | numel(n)~=nlen | (nlen>1 & nlen~=xlen)
      error('N Must be a Scalar or Vector the Same Size as X.')
   end
   x=reshape(x,1,xlen); % make x a row vector
   
   if nlen==1 % scalar n case, repeat all elements the same amount
      if n<=0 % quick exit for special case
         y=[];
         return
      end
      y=x(ones(1,n),:); % duplicate x to make n rows each containing x
      y=y(:);           % stack each column into a single column
      if r==1           % input was a row so return a row
         y=y.';
      end
   else % vector n case
      iz=find(n>0);        % look at positive repeats only
      x=x(iz);
      n=n(iz);
      csn=cumsum(n); 
      y=zeros(1,csn(end)); % preallocate temp/output variable
      y(csn(1:end-1)+1)=1; % mark indices where values increment
      y(1)=1;              % poke in first index
      y=x(cumsum(y));      % use cumsum to set indices
      if c==1              % input was a column so return a column
         y=y.';
      end
   end
elseif nargin==1 % MMREPEAT(Y)
   xlen=length(x);
   if ndims(x)~=2 | prod(size(x))~=xlen
      error('Y Must be a Vector.')
   else
      [r,c]=size(x);
   end
   x=reshape(x,1,xlen); % make x a row vector
   xnan=isnan(x);
   xinf=isinf(x);
   if any(xnan|xinf) % handle case with exceptions
      ntmp=sum(rand(1,4))*sqrt(realmax); % replacement for nan's
      itmp=1/ntmp;                       % replacement for inf's
      x(xnan)=ntmp;
      x(xinf)=itmp.*sign(x(xinf));
      y=[1 diff(x)]~=0;         % places where distinct values begin
      m=diff([find(y) xlen+1]); % counts
      x(xnan)=nan;              % poke nan's and inf's back in
      x(xinf)=inf*x(xinf);
      
   else % x contains only algebraic numbers
      y=[1 diff(x)]~=0;         % places where distinct values begin
      m=diff([find(y) xlen+1]); % counts 
   end
   y=x(y); % the unique values
   if c==1
      y=y.';
      m=m.';
   end
else
   error('Incorrect Number of Input Arguments.')
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -