idamnjanovic@61: function y = sampgrid(x,blocksize,varargin) idamnjanovic@61: %SAMPGRID Sample a multi-dimensional matrix on a regular grid. idamnjanovic@61: % Y = SAMPGRID(X,BLOCKSIZE,I1,I2,...,Ip) extracts block samples of size idamnjanovic@61: % BLOCKSIZE from the p-dimensional matrix X, arranging the samples as the idamnjanovic@61: % column vectors of the matrix Y. The locations of the (1,1,..,1)-th idamnjanovic@61: % elements of each block are given in the index vectors I1,I2,..Ip. The idamnjanovic@61: % total number of samples taken is length(I1)xlength(I2)x...xlength(Ip). idamnjanovic@61: % BLOCKSIZE should either be a p-element vector of the form [N1,N2,...Np], idamnjanovic@61: % or a scalar N which is shorthand for the square block size [N N ... N]. idamnjanovic@61: % idamnjanovic@61: % Example: Sample a set of blocks uniformly from a 2D image. idamnjanovic@61: % idamnjanovic@61: % n = 512; blocknum = 20000; blocksize = [8 8]; idamnjanovic@61: % im = rand(n,n); idamnjanovic@61: % [i1,i2] = reggrid(size(im)-blocksize+1, blocknum); idamnjanovic@61: % blocks = sampgrid(im, blocksize, i1, i2); idamnjanovic@61: % idamnjanovic@61: % See also REGGRID. idamnjanovic@61: idamnjanovic@61: % Ron Rubinstein idamnjanovic@61: % Computer Science Department idamnjanovic@61: % Technion, Haifa 32000 Israel idamnjanovic@61: % ronrubin@cs idamnjanovic@61: % idamnjanovic@61: % November 2007 idamnjanovic@61: idamnjanovic@61: idamnjanovic@61: p = ndims(x); idamnjanovic@61: if (p==2 && any(size(x)==1) && length(blocksize)==1) idamnjanovic@61: p = 1; idamnjanovic@61: end idamnjanovic@61: idamnjanovic@61: if (numel(blocksize)==1) idamnjanovic@61: blocksize = ones(1,p)*blocksize; idamnjanovic@61: end idamnjanovic@61: idamnjanovic@61: n = zeros(1,p); idamnjanovic@61: for i = 1:p idamnjanovic@61: n(i) = length(varargin{i}); idamnjanovic@61: end idamnjanovic@61: idamnjanovic@61: nsamps = prod(n); idamnjanovic@61: idamnjanovic@61: % create y of the same class as x idamnjanovic@61: y = zeros(prod(blocksize),nsamps,class(x)); idamnjanovic@61: idamnjanovic@61: % ids() contains the index of the current block in I1..Ip idamnjanovic@61: ids = ones(p,1); idamnjanovic@61: idamnjanovic@61: % block_ids contains the indices of the current block in X idamnjanovic@61: block_ids = cell(p,1); idamnjanovic@61: for j = 1:p idamnjanovic@61: block_ids{j} = varargin{j}(1) : varargin{j}(1)+blocksize(j)-1; idamnjanovic@61: end idamnjanovic@61: idamnjanovic@61: for k = 1:nsamps idamnjanovic@61: block = x(block_ids{:}); idamnjanovic@61: y(:,k) = block(:); idamnjanovic@61: idamnjanovic@61: % increment ids() and block_ids{} idamnjanovic@61: if (k