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 & iter0 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)