-
Notifications
You must be signed in to change notification settings - Fork 1
/
HK4.m
149 lines (118 loc) · 4.77 KB
/
HK4.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
function A = HK4(p,L)
if nargin == 0,0; % Argomenti di default
p = 0.55;
L = 4;
end
A.reticolo = [ 1 1 1 0
1 0 0 1
0 1 0 1
1 1 1 1];
%A.reticolo = rand(L)<p; % Creazione del reticolo
A.p= p;
A.L= L;
A.lol = zeros(1, L^2/2); % Label Of Label, vettore per ricostruzione
A.label = zeros(L); % Matrice etichette
N = L; % Campo per cicli
idx = reshape(1:L^2, L, L); % helper ricerca vicini
nnl = [zeros(L,1) idx(:,1:L-1)]; % ricerca vicino sx
nnu = [zeros(1,L); idx(1:L-1,:)]; % ricerca vicino up
A.vertPerc = []; % check percolazioene verticale
A.orizPerc = []; % check percolazioene orizzontale
percolaO = false;
pervolaV = false;
largest_label = 1; % l'etichetta parte da 1
for i = 1:L^2 %cicliamo una volta l'intera matrice e guardiamo ogni sito
if(A.reticolo(i) && ~A.label(i)) % se è colorato e non ha label
%ha vicino sx e up -> il caso "complicato"
if (nnu(i) && nnl(i) && A.reticolo(nnu(i)) && A.reticolo(nnl(i)))
%mi salvo la etichetta maggiore e la minore per dopo
mini = min(A.label(i-L), A.label(i-1));
maxi = max(A.label(i-L), A.label(i-1));
%mettiamo la label corretta (la minore) al sito
A.label(i) = min(A.label(i-L), A.label(i-1));
if mini>0 && maxi>0 && mini ~= maxi
if A.lol(mini)>0
A.lol(mini) = A.lol(mini)+1;
end
A.lol(maxi) = -mini;
elseif mini == maxi
if A.lol(mini)>0
A.lol(mini) = A.lol(mini)+1;
end
elseif mini<0 && maxi >0 && mini ~= maxi
A.lol(maxi) = -mini;
end
% ha un vicino up
elseif (nnu(i) && A.reticolo(nnu(i)))
A.label(i) = A.label(nnu(i));
if A.lol(A.label(i))>=0
A.lol(A.label(i)) = A.lol(A.label(i)) +1;
end
% ha un vicino sx
% mettiamo l'etichetta corretta, incrementiamo la LOL
% solamente se questa non punta ad un altro cluster
elseif (nnl(i) && A.reticolo(nnl(i)))
A.label(i) = A.label(nnl(i));
if A.lol(A.label(i))>=0
A.lol(A.label(i)) = A.lol(A.label(i)) +1;
end
% non ha vicini
else, A.label(i) = largest_label;
largest_label = largest_label +1;
if A.lol(A.label(i))>=0
A.lol(A.label(i)) = A.lol(A.label(i)) +1;
end
end
end
end
%++++++++++RICERCA DELLA PERCOLAZIONE+++++++++++++++++++++++++++++++++
FR = nonzeros(unique(A.label(1,:))); %prima riga
FC = nonzeros(unique(A.label(:,1))); %prima colonna
LR = nonzeros(unique(A.label(end,:))); %ultima riga
LC = nonzeros(unique(A.label(:,end))); %ultima colonna
for i=1:length(FR)
if A.lol(FR(i)) < 0
ciclo = A.lol(FR(i));
while true
ciclo = abs(ciclo);
if A.lol(ciclo) > 0
FR(i) = ciclo;
break
elseif A.lol(ciclo) < 0
ciclo = (A.lol(ciclo));
end
end
end
end
for i=1:length(LC)
if A.lol(LC(i)) < 0
ciclo = A.lol(LC(i));
while true
ciclo = abs(ciclo);
if A.lol(ciclo) > 0
LC(i) = ciclo;
break
elseif A.lol(ciclo) < 0
ciclo = (A.lol(ciclo));
end
end
end
end
for i=1:length(LR)
if A.lol(LR(i)) < 0
ciclo = A.lol(LR(i));
while true
ciclo = abs(ciclo);
if A.lol(ciclo) > 0
LR(i) = ciclo;
break
elseif A.lol(ciclo) < 0
ciclo = (A.lol(ciclo));
end
end
end
end
A.orizPerc= intersect(FC,LC);
A.vertPerc= intersect(FR,LR);
end
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++