www.pudn.com > trackingdemos.zip > mySD.m


% Jun.9,1999, a subroutine of SSD.m 
% use Accelerated Subgradient Update method 
 
function [gam]=mySD(c) 
 
n=size(c); 
S=ndims(c); 
 
if S==2 
   gam=[1:n(1)]'; 
   [J,omiga,assign]=auction(-c); 
   assi = find_assi_index(assign, n(1)); 
   gam=[gam assi]; 
   return;     
end    
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% STEP 1: Initialize 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
u=zeros(S,max(n)); 
f_dual=-realmax; 
f_primal=realmax; 
rgap=realmax; 
iter=0; 
mingap=.02;  %  typically 0.01 to 0.05 
maxiter=500; 
 
a=.2;   % typically, .05<= a <=.3 
b=1.2;  % typically, 1.1<= b <=1.6 
beta=1; 
alpha=2; 
g=ones(S,max(n)); 
H=zeros(max(n),max(n),S); 
 
while rgap>mingap & iter 0 
          dr(i,:)=d2(index,1:n(S)); 
      end 
   end    
    
   [J(S),omiga,assign]=auction(-dr);  %  dr is always a two-dim (n1 X n(r)) matrix 
   J(S)=-J(S); 
   clear dr; 
 
   assi = find_assi_index(assign, n(1)); 
   gam=[gam assi]; 
    
   % update multiplier u(S,:) 
   g(S,1:n(S))=ones(1,n(S)); 
   for k=1:n(1) 
      index=gam(k,S-1)-1;		 % gam(k,1) = k 
      for i=S-2:-1:1 
         index=index*n(i)+gam(k,i)-1; 
      end 
      index=index+1; 
      if index > 0 
          j=mod(do(index)-1,n(S))+1; % ???? 
          g(S,j)=g(S,j)-1; 
      end 
   end 
    
   if g(S,1:n(S))==0 
   else    
      if mod(iter,n(S))==0 
         p=zeros(n(S),1); 
         H2=eye(n(S)); 
      else   
         H2=H(1:n(S),1:n(S),S); 
         p=H2*g(S,1:n(S))'; 
         H2=H2+(1-alpha^(-2))*p*p'/(g(S,1:n(S))*p); 
      end    
      fa_dual=(1+a/beta^b)*f_dual; 
      adapt=(alpha+1)/alpha*(J(S)-fa_dual)/norm(g(S,1:n(S)))/norm(g(S,1:n(S))); 
      u(S,1:n(S))=u(S,1:n(S))+p'*adapt; 
      if J(2)