Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_unit_neighs.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/MIRtoolbox1.3.2/somtoolbox/som_unit_neighs.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,164 @@ +function Ne1 = som_unit_neighs(topol,lattice,shape) + +%SOM_UNIT_NEIGHS Matrix indicating units in 1-neighborhood for each map unit. +% +% Ne1 = som_unit_neighs(topol,[lattice],[shape]) +% +% Ne1 = som_unit_neighs(sTopol); +% Ne1 = som_unit_neighs(sMap.topol); +% Ne1 = som_unit_neighs([10 4], 'hexa', 'cyl'); +% Ne1 = som_unit_neighs(msize, 'rect', 'toroid'); +% +% Input and output arguments ([]'s are optional): +% topol topology of the SOM grid +% (struct) topology or map struct +% (vector) the 'msize' field of topology struct +% [lattice] (string) map lattice, 'rect' by default +% [shape] (string) map shape, 'sheet' by default +% +% Ne1 (matrix, size [munits munits]) a sparse matrix +% indicating the map units in 1-neighborhood +% by value 1 (note: the unit itself also has value 0) +% +% For more help, try 'type som_unit_neighs' or check out online documentation. +% See also SOM_NEIGHBORHOOD, SOM_UNIT_DISTS, SOM_UNIT_COORDS, SOM_CONNECTION. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_unit_neighs +% +% PURPOSE +% +% Find the adjacent (in 1-neighborhood) units for each map unit of a SOM +% based on given topology. +% +% SYNTAX +% +% Ne1 = som_unit_neighs(sMap); +% Ne1 = som_unit_neighs(sM.topol); +% Ne1 = som_unit_neighs(msize); +% Ne1 = som_unit_neighs(msize,'hexa'); +% Ne1 = som_unit_neighs(msize,'rect','toroid'); +% +% DESCRIPTION +% +% For each map unit, find the units the distance of which from +% the map unit is equal to 1. The distances are calculated +% along the map grid. Consider, for example, the case of a 4x3 map. +% The unit ('1' to 'C') positions for 'rect' and 'hexa' lattice (and +% 'sheet' shape) are depicted below: +% +% 'rect' lattice 'hexa' lattice +% -------------- -------------- +% 1 5 9 1 5 9 +% 2 6 a 2 6 a +% 3 7 b 3 7 b +% 4 8 c 4 8 c +% +% The units in 1-neighborhood (adjacent units) for unit '6' are '2','5','7' +% and 'a' in the 'rect' case and '5','2','7','9','a' and 'b' in the 'hexa' +% case. The function returns a sparse matrix having value 1 for these units. +% Notice that not all units have equal number of neighbors. Unit '1' has only +% units '2' and '5' in its 1-neighborhood. +% +% REQUIRED INPUT ARGUMENTS +% +% topol Map grid dimensions. +% (struct) topology struct or map struct, the topology +% (msize, lattice, shape) of the map is taken from +% the appropriate fields (see e.g. SOM_SET) +% (vector) the vector which gives the size of the map grid +% (msize-field of the topology struct). +% +% OPTIONAL INPUT ARGUMENTS +% +% lattice (string) The map lattice, either 'rect' or 'hexa'. Default +% is 'rect'. 'hexa' can only be used with 1- or +% 2-dimensional map grids. +% shape (string) The map shape, either 'sheet', 'cyl' or 'toroid'. +% Default is 'sheet'. +% +% OUTPUT ARGUMENTS +% +% Ne1 (matrix) sparse matrix indicating units in 1-neighborhood +% by 1, all others have value 0 (including the unit itself!), +% size is [munits munits] +% +% EXAMPLES +% +% Simplest case: +% Ne1 = som_unit_neighs(sTopol); +% Ne1 = som_unit_neighs(sMap.topol); +% Ne1 = som_unit_neighs(msize); +% Ne1 = som_unit_neighs([10 10]); +% +% If topology is given as vector, lattice is 'rect' and shape is 'sheet' +% by default. To change these, you can use the optional arguments: +% Ne1 = som_unit_neighs(msize, 'hexa', 'toroid'); +% +% The neighbors can also be calculated for high-dimensional grids: +% Ne1 = som_unit_neighs([4 4 4 4 4 4]); +% +% SEE ALSO +% +% som_neighborhood Calculate N-neighborhoods of map units. +% som_unit_coords Calculate grid coordinates. +% som_unit_dists Calculate interunit distances. +% som_connection Connection matrix. + +% Copyright (c) 1997-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 1.0beta juuso 141097 +% Version 2.0beta juuso 101199 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Check arguments + +error(nargchk(1, 3, nargin)); + +% default values +sTopol = som_set('som_topol','lattice','rect'); + +% topol +if isstruct(topol), + switch topol.type, + case 'som_map', sTopol = topol.topol; + case 'som_topol', sTopol = topol; + end +elseif iscell(topol), + for i=1:length(topol), + if isnumeric(topol{i}), sTopol.msize = topol{i}; + elseif ischar(topol{i}), + switch topol{i}, + case {'rect','hexa'}, sTopol.lattice = topol{i}; + case {'sheet','cyl','toroid'}, sTopol.shape = topol{i}; + end + end + end +else + sTopol.msize = topol; +end +if prod(sTopol.msize)==0, error('Map size is 0.'); end + +% lattice +if nargin>1 & ~isempty(lattice) & ~isnan(lattice), sTopol.lattice = lattice; end + +% shape +if nargin>2 & ~isempty(shape) & ~isnan(shape), sTopol.shape = shape; end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Action + +% distances between each map unit +Ud = som_unit_dists(sTopol); + +% 1-neighborhood are those units the distance of which is equal to 1 +munits = prod(sTopol.msize); +Ne1 = sparse(zeros(munits)); +for i=1:munits, + inds = find(Ud(i,:)<1.01 & Ud(i,:)>0); % allow for rounding error + Ne1(i,inds) = 1; +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%