function out = ShrinkMatrix(in,fac)
% out = ShrinkMatrix(IN, FAC)
% Shrinks a 2-D or 3-D matrix IN (an image) by a factor FAC.
% matrix will be truncated horizontally and vertically so that the
% resultant shrunk matrix would have integer sizes in the x an y dimension.
% size of 3rd dimension will not be scaled.
% shrinking is performed by mean computation.

% 05/09/08 DN  Wrote it.
% 13/06/12 DN  Urgh, this only went over the diagonal of each NxN submatrix
%              (where N is the scaling factor)


% input checking
if ndims(in)>3
    error('input is not an image');
end

ys = size(in,1);
xs = size(in,2);

if fac ~= round(fac)
    error('scaling factor must be an integer');
end

hcut = mod(xs,fac);
vcut = mod(ys,fac);
if hcut~=0
    disp(sprintf('Warning: right edge of input will be truncated by %d pixels',hcut));
end
if vcut~=0
    disp(sprintf('Warning: lower edge of input will be truncated by %d pixels',vcut));
end

if hcut~=0 || vcut~=0
    in = in(1:end-vcut,1:end-hcut,:);
    xs = xs-hcut;
    ys = ys-vcut;
end

out = zeros(ys/fac,xs/fac,size(in,3));
for p=1:fac     % image rows
    for q=1:fac     % image columns
        out = out + in(p:fac:ys,q:fac:xs,:);
    end
end
out = out./(fac^2);