[5] | 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 |
---|