diff toolboxes/FullBNT-1.0.7/graph/mk_2D_lattice_slow.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/FullBNT-1.0.7/graph/mk_2D_lattice_slow.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,135 @@
+function G = mk_2D_lattice_slow(nrows, ncols, wrap_around) 
+% MK_2D_LATTICE Return adjacency matrix for 4-nearest neighbor connected 2D lattice
+% G = mk_2D_lattice(nrows, ncols, wrap_around)
+% G(k1, k2) = 1 iff k1=(i1,j1) is connected to k2=(i2,j2)
+%
+% If wrap_around = 1, we use toroidal boundary conditions (default = 0)
+%
+% Nodes are assumed numbered as in the following 3x3 lattice
+%   1 4 7
+%   2 5 8 
+%   3 6 9
+%
+% e.g., G = mk_2D_lattice(3, 3, 0) returns
+%   0 1 0 1 0 0 0 0 0 
+%   1 0 1 0 1 0 0 0 0 
+%   0 1 0 0 0 1 0 0 0 
+%   1 0 0 0 1 0 1 0 0 
+%   0 1 0 1 0 1 0 1 0 
+%   0 0 1 0 1 0 0 0 1 
+%   0 0 0 1 0 0 0 1 0 
+%   0 0 0 0 1 0 1 0 1 
+%   0 0 0 0 0 1 0 1 0 
+% so find(G(5,:)) = [2 4 6 8] 
+% but find(G(1,:)) = [2 4]
+%
+% Using wrap around, G = mk_2D_lattice(3, 3, 1), we get
+%   0 1 1 1 0 0 1 0 0 
+%   1 0 1 0 1 0 0 1 0 
+%   1 1 0 0 0 1 0 0 1 
+%   1 0 0 0 1 1 1 0 0 
+%   0 1 0 1 0 1 0 1 0 
+%   0 0 1 1 1 0 0 0 1 
+%   1 0 0 1 0 0 0 1 1 
+%   0 1 0 0 1 0 1 0 1 
+%   0 0 1 0 0 1 1 1 0 
+% so find(G(5,:)) = [2 4 6 8] 
+% and find(G(1,:)) = [2 3 4 7]
+
+if nargin < 3, wrap_around = 0; end
+
+% M contains the number of each cell e.g.
+%   1 4 7
+%   2 5 8 
+%   3 6 9
+% North neighbors (assuming wrap around) are
+%   3 6 9
+%   1 4 7
+%   2 5 8
+% Without wrap around, they are
+%   1 4 7
+%   1 4 7
+%   2 5 8
+% The first row is arbitrary, since pixels at the top have no north neighbor.
+
+if nrows==1
+  G = zeros(1, ncols);
+  for i=1:ncols-1
+    G(i,i+1) = 1;
+    G(i+1,i) = 1;
+  end
+  if wrap_around
+    G(1,ncols) = 1;
+    G(ncols,1) = 1;
+  end
+  return;
+end
+
+  
+npixels = nrows*ncols;
+
+N = 1; E = 2; S = 3; W = 4;
+if wrap_around
+  rows{N} = [nrows 1:nrows-1]; cols{N} = 1:ncols;
+  rows{E} = 1:nrows; cols{E} = [2:ncols 1];
+  rows{S} = [2:nrows 1]; cols{S} = 1:ncols;
+  rows{W} = 1:nrows; cols{W} = [ncols 1:ncols-1];
+else
+  rows{N} = [1 1:nrows-1]; cols{N} = 1:ncols;
+  rows{E} = 1:nrows; cols{E} = [1 1:ncols-1];
+  rows{S} = [2:nrows nrows]; cols{S} = 1:ncols;
+  rows{W} = 1:nrows; cols{W} = [2:ncols ncols];
+end
+
+M = reshape(1:npixels, [nrows ncols]);
+nbrs = cell(1, 4);
+for i=1:4
+  nbrs{i} = M(rows{i}, cols{i});
+end
+
+
+G = zeros(npixels, npixels);
+if wrap_around
+  for i=1:4
+    if 0
+      % naive
+      for p=1:npixels
+	G(p, nbrs{i}(p)) = 1;
+      end
+    else
+      % vectorized
+      ndx2 = sub2ind([npixels npixels], 1:npixels, nbrs{i}(:)');
+      G(ndx2) = 1;
+    end
+  end
+else
+  i = N;
+  mask = ones(nrows, ncols);
+  mask(1,:) = 0; % pixels in row 1 have no nbr to the north
+  ndx = find(mask);
+  ndx2 = sub2ind([npixels npixels], ndx, nbrs{i}(ndx));
+  G(ndx2) = 1;
+
+  i = E;
+  mask = ones(nrows, ncols);
+  mask(:,ncols) = 0;
+  ndx = find(mask);
+  ndx2 = sub2ind([npixels npixels], ndx, nbrs{i}(ndx));
+  G(ndx2) = 1;
+
+  i = S;
+  mask = ones(nrows, ncols);
+  mask(nrows,:)=0;
+  ndx = find(mask);
+  ndx2 = sub2ind([npixels npixels], ndx, nbrs{i}(ndx));
+  G(ndx2) = 1;
+  
+  i = W;
+  mask = ones(nrows, ncols);
+  mask(:,1)=0;
+  ndx = find(mask);
+  ndx2 = sub2ind([npixels npixels], ndx, nbrs{i}(ndx));
+  G(ndx2) = 1;
+end
+
+G = setdiag(G, 0);