1 | function R = change_R(R,c,beta,gammac) |
---|
2 | % R = change_R(R,c,beta,gammac) |
---|
3 | % |
---|
4 | % Auxiliary function for the incremental SVDD, see there. |
---|
5 | |
---|
6 | % Copyright: D.M.J. Tax, D.M.J.Tax@prtools.org |
---|
7 | % Faculty EWI, Delft University of Technology |
---|
8 | % P.O. Box 5031, 2600 GA Delft, The Netherlands |
---|
9 | |
---|
10 | % Note that n is one larger than set S, because of the |
---|
11 | % added parameter b at the beginning! |
---|
12 | n = size(R,1); |
---|
13 | |
---|
14 | % In some unfortunate cases the gamma_c can be very very small (like 0), |
---|
15 | % and in these cases we don't want to blow up the whole thing. Therefore |
---|
16 | % we define a small eps and define that as the smallest gamma_c |
---|
17 | % possible. |
---|
18 | smalleps = 1e-12; |
---|
19 | |
---|
20 | if c>0 % we add object c to R |
---|
21 | if abs(gammac)>smalleps |
---|
22 | R = [R zeros(n,1); zeros(1,n+1)] + ... |
---|
23 | ([beta;1]/gammac)*[beta' 1]; |
---|
24 | % Improve the numerical stability (overflow) for large beta and |
---|
25 | % gammac, by first dividing by gammac and then multiplying again |
---|
26 | % by beta. |
---|
27 | % Fix suggested by Mauro Del Rio |
---|
28 | else |
---|
29 | warning('dd_tools:change_R:DivideByZero','We are about to divide by 0.'); |
---|
30 | R = [R zeros(n,1); zeros(1,n+1)] + ... |
---|
31 | ([beta;1]/(sign(gammac)*smalleps))*[beta' 1]; |
---|
32 | end |
---|
33 | else % we remove object c from R |
---|
34 | c = -c; % ok, get rid of the sign |
---|
35 | Irm = [1:c,c+2:n]; |
---|
36 | if R(c+1,c+1)>smalleps % whatever... |
---|
37 | R = R(Irm,Irm) - R(Irm,c+1)*R(c+1,Irm)/R(c+1,c+1); |
---|
38 | else |
---|
39 | R = R(Irm,Irm) - R(Irm,c+1)*R(c+1,Irm)/smalleps; |
---|
40 | end |
---|
41 | end |
---|