gitsvnid: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@112 83ab2cfd5345466c8aeb2b2739fb922d
Christoph Budziszewski authored on21/01/2009 16:34:251  1 
new file mode 100644 
...  ... 
@@ 0,0 +1,157 @@ 
1 
+function Ne = som_neighborhood(Ne1,n) 

2 
+ 

3 
+%SOM_NEIGHBORHOOD Calculate neighborhood matrix. 

4 
+% 

5 
+% Ne = som_neighborhood(Ne1,n) 

6 
+% 

7 
+% Ne = som_neighborhood(Ne1); 

8 
+% Ne = som_neighborhood(som_unit_neighs(topol),2); 

9 
+% 

10 
+% Input and output arguments ([]'s are optional): 

11 
+% Ne1 (matrix, size [munits m]) a sparse matrix indicating 

12 
+% the units in 1neighborhood for each map unit 

13 
+% [n] (scalar) maximum neighborhood which is calculated, default=Inf 

14 
+% 

15 
+% Ne (matrix, size [munits munits]) neighborhood matrix, 

16 
+% each row (and column) contains neighborhood 

17 
+% values from the specific map unit to all other 

18 
+% map units, or Inf if the value is unknown. 

19 
+% 

20 
+% For more help, try 'type som_neighborhood' or check out online documentation. 

21 
+% See also SOM_UNIT_NEIGHS, SOM_UNIT_DISTS, SOM_UNIT_COORDS, SOM_CONNECTION. 

22 
+ 

23 
+%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

24 
+% 

25 
+% som_neighborhood 

26 
+% 

27 
+% PURPOSE 

28 
+% 

29 
+% Calculate to which neighborhood each map unit belongs to relative to 

30 
+% each other map unit, given the units in 1neighborhood of each unit. 

31 
+% 

32 
+% SYNTAX 

33 
+% 

34 
+% Ne = som_neighborhood(Ne1); 

35 
+% Ne = som_neighborhood(Ne1,n); 

36 
+% 

37 
+% DESCRIPTION 

38 
+% 

39 
+% For each map unit, finds the minimum neighborhood to which it belongs 

40 
+% to relative to each other map unit. Or, equivalently, for each map 

41 
+% unit, finds which units form its kneighborhood, where k goes from 

42 
+% 0 to n. 

43 
+% 

44 
+% The neighborhood is calculated iteratively using the reflexivity of 

45 
+% neighborhood. 

46 
+% let N1i be the 1neighborhood set a unit i 

47 
+% and let N11i be the set of units in the 1neighborhood of any unit j in N1i 

48 
+% then N2i (the 2neighborhood set of unit i) is N11i \ N1i 

49 
+% 

50 
+% Consider, for example, the case of a 5x5 map. The neighborhood in case of 

51 
+% 'rect' and 'hexa' lattices (and 'sheet' shape) for the unit at the 

52 
+% center of the map are depicted below: 

53 
+% 

54 
+% 'rect' lattice 'hexa' lattice 

55 
+%   

56 
+% 4 3 2 3 4 3 2 2 2 3 

57 
+% 3 2 1 2 3 2 1 1 2 3 

58 
+% 2 1 0 1 2 2 1 0 1 2 

59 
+% 3 2 1 2 3 2 1 1 2 3 

60 
+% 4 3 2 3 4 3 2 2 2 3 

61 
+% 

62 
+% Because the iterative procedure is rather slow, the neighborhoods 

63 
+% are calculated upto given maximal value. The uncalculated values 

64 
+% in the returned matrix are Inf:s. 

65 
+% 

66 
+% REQUIRED INPUT ARGUMENTS 

67 
+% 

68 
+% Ne1 (matrix) Each row contains 1, if the corresponding unit is adjacent 

69 
+% for that map unit, 0 otherwise. This can be calculated 

70 
+% using SOM_UNIT_NEIGHS. The matrix can be sparse. 

71 
+% Size munits x munits. 

72 
+% 

73 
+% OPTIONAL INPUT ARGUMENTS 

74 
+% 

75 
+% n (scalar) Maximal neighborhood value which is calculated, 

76 
+% Inf by default (all neighborhoods). 

77 
+% 

78 
+% OUTPUT ARGUMENTS 

79 
+% 

80 
+% Ne (matrix) neighborhood values for each map unit, size is 

81 
+% [munits, munits]. The matrix contains the minimum 

82 
+% neighborhood of unit i, to which unit j belongs, 

83 
+% or Inf, if the neighborhood was bigger than n. 

84 
+% 

85 
+% EXAMPLES 

86 
+% 

87 
+% Ne = som_neighborhood(Ne1,1); % upto 1neighborhood 

88 
+% Ne = som_neighborhood(Ne1,Inf); % all neighborhoods 

89 
+% Ne = som_neighborhood(som_unit_neighs(topol),4); 

90 
+% 

91 
+% SEE ALSO 

92 
+% 

93 
+% som_unit_neighs Calculate units in 1neighborhood for each map unit. 

94 
+% som_unit_coords Calculate grid coordinates. 

95 
+% som_unit_dists Calculate interunit distances. 

96 
+% som_connection Connection matrix. 

97 
+ 

98 
+% Copyright (c) 19992000 by the SOM toolbox programming team. 

99 
+% http://www.cis.hut.fi/projects/somtoolbox/ 

100 
+ 

101 
+% Version 1.0beta juuso 141097 

102 
+% Version 2.0beta juuso 101199 

103 
+ 

104 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

105 
+%% Check arguments 

106 
+ 

107 
+error(nargchk(1, 2, nargin)); 

108 
+ 

109 
+if nargin<2, n=Inf; end 

110 
+ 

111 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

112 
+%% Action 

113 
+ 

114 
+% initialize 

115 
+if issparse(Ne1), Ne = full(Ne1); else Ne = Ne1; end 

116 
+clear Ne1 

117 
+[munits dummy] = size(Ne); 

118 
+Ne(find(Ne==0)) = NaN; 

119 
+for i=1:munits, Ne(i,i)=0; end 

120 
+ 

121 
+% Calculate neighborhood distance for each unit using reflexsivity 

122 
+% of neighborhood: 

123 
+% let N1i be the 1neighborhood set a unit i 

124 
+% then N2i is the union of all map units, belonging to the 

125 
+% 1neighborhood of any unit j in N1i, not already in N1i 

126 
+k=1; 

127 
+if n>1, 

128 
+ fprintf(1,'Calculating neighborhood: 1 '); 

129 
+ N1 = Ne; 

130 
+ N1(find(N1~=1)) = 0; 

131 
+end 

132 
+while k<n & any(isnan(Ne(:))), 

133 
+ k=k+1; 

134 
+ fprintf(1,'%d ',k); 

135 
+ for i=1:munits, 

136 
+ candidates = isnan(Ne(i,:)); % units not in any neighborhood yet 

137 
+ if any(candidates), 

138 
+ prevneigh = find(Ne(i,:)==k1); % neighborhood (k1) 

139 
+ N1_of_prevneigh = any(N1(prevneigh,:)); % union of their N1:s 

140 
+ Nn = find(N1_of_prevneigh & candidates); 

141 
+ if length(Nn), Ne(i,Nn) = k; Ne(Nn,i) = k; end 

142 
+ end 

143 
+ end 

144 
+end 

145 
+if n>1, fprintf(1,'\n'); end 

146 
+ 

147 
+% finally replace all uncalculated distance values with Inf 

148 
+Ne(find(isnan(Ne))) = Inf; 

149 
+ 

150 
+return; 

151 
+ 

152 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

153 
+%% faster version? 

154 
+ 

155 
+l = size(Ne1,1); Ne1([0:l1]*(l+1)+1) = 1; Ne = full(Ne1); M0 = Ne1; k = 2; 

156 
+while any(Ne(:)==0), M1=(M0*Ne1>0); Ne(find(M1M0))=k; M0=M1; k=k+1; end 

157 
+Ne([0:l1]*(l+1)+1) = 0; 