www.gusucode.com > elmat工具箱matlab源码程序 > elmat/+matlab/+internal/+builtinhelper/repelem.m
function B = repelem(A, varargin) %REPELEM Replicate elements of an array. % U = REPELEM(V,N), where V is a vector, returns a vector of repeated % elements of V. % - If N is a scalar, each element of V is repeated N times. % - If N is a vector, element V(i) is repeated N(i) times. N must be the % same length as V. % % B = repelem(A, R1, ..., RN), returns an array with each element of A % repeated according to R1, ..., RN. Each R1, ..., RN must either be a % scalar or a vector with the same length as A in the corresponding % dimension. % % Example: If A is a matrix, repelem(A, 2, 3) returns a matrix containing % a 2-by-3 block of each element of A. % % See also REPMAT, BSXFUN, MESHGRID. % Copyright 1984-2014 The MathWorks, Inc. if nargin < 2 error(message('MATLAB:minrhs')) end if isscalar(A) && ~isobject(A) if nargin == 2 p = varargin{1}; if ~isnumeric(p) && ~islogical(p) error(message('MATLAB:repelem:nonNumericReplications')); end p = full(double(p)); if isscalar(p) if p >= 0 && p == floor(p) szB = [1 p]; else error(message('MATLAB:repelem:invalidReplications')); end elseif isvector(p) error(message('MATLAB:repelem:mismatchedReplicationsVector')); else error(message('MATLAB:repelem:invalidReplications')); end else % nargin > 2 szB = ones(1, nargin-1); for ii=1:nargin-1 p = varargin{ii}; if ~isnumeric(p) && ~islogical(p) error(message('MATLAB:repelem:nonNumericReplications')); end p = full(double(p)); if isscalar(p) if p >= 0 && p == floor(p) szB(ii) = p; else error(message('MATLAB:repelem:invalidReplications')); end elseif isvector(p) error(message('MATLAB:repelem:mismatchedReplications')); else error(message('MATLAB:repelem:invalidReplications')); end end end numelB = prod(szB); if numelB > 0 && numelB < (2^31)-1 B(numelB) = A; if ~isequal(B(1), B(numelB)) || ~(isnumeric(A) || islogical(A)) % if B(1) is the same as B(nelems), then the default value filled in for % B(1:end-1) is already A, so we don't need to waste time redoing % this operation. (This optimizes the case that A is a scalar zero of % some class.) B(:) = A; end B = reshape(B, szB); return; end end if nargin == 2 szA = size(A); % Avoid calling isvector(A) to minimize the requirements on A if numel(szA) > 2 || (szA(1) ~= 1 && szA(2) ~= 1) % equivalent to ~isvector(A) error(message('MATLAB:repelem:twoInputNonVector')); end % Avoid calling length(A) to minimize the requirements on A lenA = szA(1); if lenA == 1 lenA = szA(2); end p = varargin{1}; if ~isnumeric(p) && ~islogical(p) error(message('MATLAB:repelem:nonNumericReplications')); end p = full(double(p)); if ~isvector(p) || ~all(p >= 0) || ~all(p == floor(p)) error(message('MATLAB:repelem:invalidReplications')); end if isscalar(p) tmp = 1:lenA; ind = tmp(ones(p, 1, 'like', p), :); ind = ind(:)'; else % p is a vector if numel(p) == lenA starts = accumarray(cumsum([1; p(:)]), 1); ind = cumsum(starts(1:end-1)); else error(message('MATLAB:repelem:mismatchedReplicationsVector')); end end B = A(ind); else % nargin > 2 szA = size(A); Bdims = max(nargin-1, numel(szA)); szA(end+1:Bdims) = 1; ind = cell(1, Bdims); for ii=1:nargin-1 p = varargin{ii}; if ~isnumeric(p) && ~islogical(p) error(message('MATLAB:repelem:nonNumericReplications')); end p = full(double(p)); if ~isvector(p) || ~all(p >= 0) || ~all(p == floor(p)) error(message('MATLAB:repelem:invalidReplications')); end if isscalar(p) tmp = 1:szA(ii); ind{ii} = tmp(ones(p, 1, 'like', p), :); ind{ii} = ind{ii}(:); else % p is a vector if numel(p) == szA(ii) starts = accumarray(cumsum([1; p(:)]), 1); ind{ii} = cumsum(starts(1:end-1)); else error(message('MATLAB:repelem:mismatchedReplications')); end end end for ii=nargin:Bdims ind{ii} = 1:szA(ii); end B = A(ind{:}); end