www.gusucode.com > elmat工具箱matlab源码程序 > elmat/+matlab/+internal/+builtinhelper/repmat.m

    function B = repmat(A,varargin)
%REPMAT Replicate and tile an array.
%   B = repmat(A,M,N) creates a large matrix B consisting of an M-by-N
%   tiling of copies of A. The size of B is [size(A,1)*M, size(A,2)*N].
%   The statement repmat(A,N) creates an N-by-N tiling.
%
%   B = REPMAT(A,[M N]) accomplishes the same result as repmat(A,M,N).
%
%   B = REPMAT(A,[M N P ...]) tiles the array A to produce a
%   multidimensional array B composed of copies of A. The size of B is
%   [size(A,1)*M, size(A,2)*N, size(A,3)*P, ...].
%
%   REPMAT(A,M,N) when A is a scalar is commonly used to produce an M-by-N
%   matrix filled with A's value and having A's CLASS. For certain values,
%   you may achieve the same results using other functions. Namely,
%      REPMAT(NAN,M,N)           is the same as   NAN(M,N)
%      REPMAT(SINGLE(INF),M,N)   is the same as   INF(M,N,'single')
%      REPMAT(INT8(0),M,N)       is the same as   ZEROS(M,N,'int8')
%      REPMAT(UINT32(1),M,N)     is the same as   ONES(M,N,'uint32')
%      REPMAT(EPS,M,N)           is the same as   EPS(ONES(M,N))
%
%   Example:
%       repmat(magic(2), 2, 3)
%       repmat(uint8(5), 2, 3)
%
%   Class support for input A:
%      float: double, single
%      integer: uint8, int8, uint16, int16, uint32, int32, uint64, int64
%      char, logical
%
%   See also BSXFUN, MESHGRID, ONES, ZEROS, NAN, INF.

%   Copyright 1984-2013 The MathWorks, Inc.

if nargin < 2
    error(message('MATLAB:minrhs'))
elseif nargin == 2
    M = varargin{1};
    if isscalar(M)
        siz = [M M];
    elseif isempty(M)
        siz = [1 1];
        warning(message('MATLAB:repmat:emptyReplications'));
    elseif isrow(M)
        siz = M;
    else
        error(message('MATLAB:repmat:invalidReplications'));
    end
    siz = double(siz);
else % nargin > 2
    if ~all(cellfun(@isscalar,varargin))
        if nargin == 3  % this code maintains backward compatibility
            M = varargin{1};
            N = varargin{2};
            if (isrow(M) && size(M,2)>1 && (isrow(N) || isempty(N))) || ...
                    (isrow(M) && size(M,2)>0 && isrow(N) && size(N,2)>1)
                siz = [M N];
                warning(message('MATLAB:repmat:rowReplications'));
            elseif isempty(N) && numel(M) <= 1
                siz = [M 1 1];
                warning(message('MATLAB:repmat:emptyReplications'));
            else
                error(message('MATLAB:repmat:invalidReplications'));
            end
        else
            error(message('MATLAB:repmat:invalidReplications'));
        end
    else
        siz = cellfun(@(x)double(full(x)),varargin);
    end
end

if isscalar(A) && ~isobject(A)
    nelems = prod(siz);
    if nelems>0 && nelems < (2^31)-1 % use linear indexing for speed.
        % Since B doesn't exist, the first statement creates a B with
        % the right size and type.  Then use scalar expansion to
        % fill the array. Finally reshape to the specified size.
        B(nelems) = A;
        if ~isequal(B(1), B(nelems)) || ~(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,siz);
    elseif all(siz > 0) % use general indexing, cost of memory allocation dominates.
        ind = num2cell(siz);
        B(ind{:}) = A;
        if ~isequal(B(1), B(ind{:})) || ~(isnumeric(A) || islogical(A))
            B(:) = A;
        end
    else
        B = A(ones(siz));
    end
elseif ismatrix(A) && numel(siz) == 2
    [m,n] = size(A);
    if (m == 1 && siz(2) == 1)
        B = A(ones(siz(1), 1), :);
    elseif (n == 1 && siz(1) == 1)
        B = A(:, ones(siz(2), 1));
    else
        mind = (1:m)';
        nind = (1:n)';
        mind = mind(:,ones(1,siz(1)));
        nind = nind(:,ones(1,siz(2)));
        B = A(mind,nind);
    end
else
    Asiz = size(A);
    Asiz = [Asiz ones(1,length(siz)-length(Asiz))];
    siz = [siz ones(1,length(Asiz)-length(siz))];
    subs = cell(1,length(Asiz));
    for i=length(Asiz):-1:1
        ind = (1:Asiz(i))';
        subs{i} = ind(:,ones(1,siz(i)));
    end
    B = A(subs{:});
end