comparison Problems/private/sampgrid.m @ 61:42fcbcfca132

(none)
author idamnjanovic
date Tue, 15 Mar 2011 12:21:31 +0000
parents
children
comparison
equal deleted inserted replaced
60:ad36f80e2ccf 61:42fcbcfca132
1 function y = sampgrid(x,blocksize,varargin)
2 %SAMPGRID Sample a multi-dimensional matrix on a regular grid.
3 % Y = SAMPGRID(X,BLOCKSIZE,I1,I2,...,Ip) extracts block samples of size
4 % BLOCKSIZE from the p-dimensional matrix X, arranging the samples as the
5 % column vectors of the matrix Y. The locations of the (1,1,..,1)-th
6 % elements of each block are given in the index vectors I1,I2,..Ip. The
7 % total number of samples taken is length(I1)xlength(I2)x...xlength(Ip).
8 % BLOCKSIZE should either be a p-element vector of the form [N1,N2,...Np],
9 % or a scalar N which is shorthand for the square block size [N N ... N].
10 %
11 % Example: Sample a set of blocks uniformly from a 2D image.
12 %
13 % n = 512; blocknum = 20000; blocksize = [8 8];
14 % im = rand(n,n);
15 % [i1,i2] = reggrid(size(im)-blocksize+1, blocknum);
16 % blocks = sampgrid(im, blocksize, i1, i2);
17 %
18 % See also REGGRID.
19
20 % Ron Rubinstein
21 % Computer Science Department
22 % Technion, Haifa 32000 Israel
23 % ronrubin@cs
24 %
25 % November 2007
26
27
28 p = ndims(x);
29 if (p==2 && any(size(x)==1) && length(blocksize)==1)
30 p = 1;
31 end
32
33 if (numel(blocksize)==1)
34 blocksize = ones(1,p)*blocksize;
35 end
36
37 n = zeros(1,p);
38 for i = 1:p
39 n(i) = length(varargin{i});
40 end
41
42 nsamps = prod(n);
43
44 % create y of the same class as x
45 y = zeros(prod(blocksize),nsamps,class(x));
46
47 % ids() contains the index of the current block in I1..Ip
48 ids = ones(p,1);
49
50 % block_ids contains the indices of the current block in X
51 block_ids = cell(p,1);
52 for j = 1:p
53 block_ids{j} = varargin{j}(1) : varargin{j}(1)+blocksize(j)-1;
54 end
55
56 for k = 1:nsamps
57 block = x(block_ids{:});
58 y(:,k) = block(:);
59
60 % increment ids() and block_ids{}
61 if (k<nsamps)
62 j = 1;
63 while (ids(j) == n(j))
64 ids(j) = 1;
65 block_ids{j} = varargin{j}(1) : varargin{j}(1)+blocksize(j)-1;
66 j = j+1;
67 end
68 ids(j) = ids(j)+1;
69 block_ids{j} = varargin{j}(ids(j)) : varargin{j}(ids(j))+blocksize(j)-1;
70 end
71 end
72