Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_connection.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_connection.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,173 @@ +function C=som_connection(S) + +%SOM_CONNECTION Connection matrix for 'hexa' and 'rect' lattices +% +% C=som_connection(S) +% +% C=som_connection(sMap); +% C=som_connection(sTopol); +% C=som_connection({'hexa', [6 5], 'sheet'}); +% +% Input and output arguments: +% S (struct) map or topol struct +% (cell array) a cell array of form {lattice, msize, shape}, where +% lattice: 'hexa' or 'rect' +% msize : 1x2 vector +% shape : 'sheet', 'cyl or 'toroid' +% +% C (sparse) An NxN connection matrix, N=prod(msize) +% +% The function returns a connection matrix, e.g., for drawing +% connections between map units in the function som_grid. Note that +% the connections are defined only in the upper triangular part to +% save some memory!! Function SOM_UNIT_NEIGHS does the same thing, +% but also has values in the lower triangular. It is also slower. +% +% For more help, try 'type som_connection' or check out online documentation. +% See also SOM_GRID, SOM_UNIT_NEIGHS. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_connection +% +% PURPOSE +% +% To create a connection matrix of SOM 'hexa' and 'rect' negihborhoods +% +% SYNTAX +% +% C = som_connection(S) +% +% DESCRIPTION +% +% Creates a connection matrix of SOM 'hexa' and 'rect' +% neighborhoods. The connections are defined only in the upper +% triangular part to save some memory. +% +% Function SOM_UNIT_NEIGHS does the same thing, but also has values +% in the lower triangular. It is also slower, except for +% 'toroid' shape because in that case this function calls +% SOM_UNIT_NEIGHS... +% +% REQUIRED INPUT ARGUMENTS +% +% S map topology +% (map struct) S.topol is used to build the matrix +% (topol struct) topology information is used to build the matrix +% (cell array) of form {lattice, msize, shape}, where +% lattice: 'hexa' or 'rect' +% msize : 1x2 vector +% shape : 'sheet', 'cyl or 'toroid' +% +% OUTPUT ARGUMENTS +% +% C (sparse) munits x munits sparse matrix which describes +% nearest neighbor connections between units +% +% EXAMPLE +% +% C = som_connection('hexa',[3 4],'sheet'); +% full(C) +% ans = +% +% 0 1 0 1 0 0 0 0 0 0 0 0 +% 0 0 1 1 1 1 0 0 0 0 0 0 +% 0 0 0 0 0 1 0 0 0 0 0 0 +% 0 0 0 0 1 0 1 0 0 0 0 0 +% 0 0 0 0 0 1 1 1 1 0 0 0 +% 0 0 0 0 0 0 0 0 1 0 0 0 +% 0 0 0 0 0 0 0 1 0 1 0 0 +% 0 0 0 0 0 0 0 0 1 1 1 1 +% 0 0 0 0 0 0 0 0 0 0 0 1 +% 0 0 0 0 0 0 0 0 0 0 1 0 +% 0 0 0 0 0 0 0 0 0 0 0 1 +% 0 0 0 0 0 0 0 0 0 0 0 0 +% +% SEE ALSO +% +% som_grid Visualization of a SOM grid +% som_unit_neighs Units in 1-neighborhood for all map units. + +% Copyright (c) 1999-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0alpha Johan 061099 juuso 151199 170400 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Check arguments + +error(nargchk(1, 1, nargin)); % check number of input arguments + +[tmp,ok,tmp]=som_set(S); +if isstruct(S) & all(ok), % check m type + switch S.type + case 'som_topol' + msize=S.msize; + lattice=S.lattice; + shape=S.shape; + case 'som_map' + msize=S.topol.msize; + lattice=S.topol.lattice; + shape=S.topol.shape; + otherwise + error('Invalid map or topol struct.'); + end +elseif iscell(S), + if vis_valuetype(S,{'topol_cell'}), + lattice=S{1}; + msize=S{2}; + shape=S{3}; + else + error('{lattice, msize, shape} expected for cell input.') + end +else + error('{lattice, msize, shape}, or map or topol struct expected.') +end + +if ~vis_valuetype(msize,{'1x2'}) + error('Invalid map size: only 2D maps allowed.') +end + +%% Init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +N=msize(1)*msize(2); + +%% Action & Build output arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +switch lattice +case 'hexa' + l1=ones(N,1); l1((msize(1)+1):msize(1):end)=0; + l2=zeros(msize(1),1); l3=l2; + l2(1:2:end-1)=1; l3(3:2:end)=1; + l2=repmat(l2,msize(2),1); + l3=repmat(l3,msize(2),1); + C= ... + spdiags([l1 l2 ones(N,1) l3], [1 msize(1)-1:msize(1)+1],N,N); +case 'rect' + l1=ones(N,1);l1((msize(1)+1):msize(1):end)=0; + C=spdiags([l1 ones(N,1)],[1 msize(1)],N,N); +otherwise + error('Unknown lattice.') +end + +switch shape +case 'sheet' + ; +case 'cyl' + C=spdiags(ones(N,1),msize(1)*(msize(2)-1),C); +case 'toroid' + %warning('Toroid not yet implemented: using ''cyl''.'); + %C=spdiags(ones(N,1),msize(1)*(msize(2)-1),C); + %l=zeros(N,1); l(1:msize(2):end)=1; + %C=spdiags(l,msize(1),C); + + % use som_unit_neighs to calculate these + C = som_unit_neighs(msize,lattice,'toroid'); + % to be consistent, set the lower triangular values to zero + munits = prod(msize); + for i=1:(munits-1), C((i+1):munits,i) = 0; end +otherwise + error('Unknown shape.'); +end + +