sustaining_gazes/matlab_version/face_validation/DeepLearnToolbox/util/expand.m

54 lines
1.9 KiB
Matlab

function B = expand(A, S)
%EXPAND Replicate and tile each element of an array, similar to repmat.
% EXPAND(A,SZ), for array A and vector SZ replicates each element of A by
% SZ. The results are tiled into an array in the same order as the
% elements of A, so that the result is size: size(A).*SZ. Therefore the
% number of elements of SZ must equal the number of dimensions of A, or in
% MATLAB syntax: length(size(A))==length(SZ) must be true.
% The result will have the same number of dimensions as does A.
% There is no restriction on the number of dimensions for input A.
%
% Examples:
%
% A = [1 2; 3 4]; % 2x2
% SZ = [6 5];
% B = expand(A,[6 5]) % Creates a 12x10 array.
%
% The following demonstrates equivalence of EXPAND and expansion acheived
% through indexing the individual elements of the array:
%
% A = 1; B = 2; C = 3; D = 4; % Elements of the array to be expanded.
% Mat = [A B;C D]; % The array to expand.
% SZ = [2 3]; % The expansion vector.
% ONES = ones(SZ); % The index array.
% ExpMat1 = [A(ONES),B(ONES);C(ONES),D(ONES)]; % Element expansion.
% ExpMat2 = expand(Mat,SZ); % Calling EXPAND.
% isequal(ExpMat1,ExpMat2) % Yes
%
%
% See also, repmat, meshgrid, ones, zeros, kron
%
% Author: Matt Fig
% Date: 6/20/2009
% Contact: popkenai@yahoo.com
if nargin < 2
error('Size vector must be provided. See help.');
end
SA = size(A); % Get the size (and number of dimensions) of input.
if length(SA) ~= length(S)
error('Length of size vector must equal ndims(A). See help.')
elseif any(S ~= floor(S))
error('The size vector must contain integers only. See help.')
end
T = cell(length(SA), 1);
for ii = length(SA) : -1 : 1
H = zeros(SA(ii) * S(ii), 1); % One index vector into A for each dim.
H(1 : S(ii) : SA(ii) * S(ii)) = 1; % Put ones in correct places.
T{ii} = cumsum(H); % Cumsumming creates the correct order.
end
B = A(T{:}); % Feed the indices into A.