wolffd@0: function result = threshFull_admmMixed(R,lam); wolffd@0: % return argmin_V lam*||V||_2,1 + 0.5 ||V - A||_F^2 wolffd@0: % symmetry constraint on V wolffd@0: wolffd@0: wolffd@0: wolffd@0: W = R; wolffd@0: V = eye(length(R)); wolffd@0: U = zeros(size(R)); wolffd@0: q = 1; wolffd@0: mu = 100; wolffd@0: mult = 2; wolffd@0: wolffd@0: p = numel(R); wolffd@0: n = numel(U); wolffd@0: tol = 1e-4; wolffd@0: ptol = tol * sqrt(p); wolffd@0: dtol = tol * sqrt(n); wolffd@0: wolffd@0: iter = 0; wolffd@0: while 1 wolffd@0: iter = iter + 1; wolffd@0: Vold = V; wolffd@0: W = threshFull_mixed(((1*R+q*(V-U))/(1+q)),lam/(1+q)); wolffd@0: V = feasible_symm(W+U); wolffd@0: U = U + W - V; wolffd@0: wolffd@0: pr = q * norm( V(:)-Vold(:)); wolffd@0: dr = norm((W(:) - V(:))); wolffd@0: wolffd@0: if pr < ptol && dr < dtol,break,end wolffd@0: wolffd@0: if pr/dr > mu wolffd@0: q = 1/mult * q; wolffd@0: U = mult * U; wolffd@0: % disp(['q = ' num2str(q)]); wolffd@0: elseif dr/pr > mu wolffd@0: q = mult * q; wolffd@0: U = 1/mult * U; wolffd@0: % disp(['q = ' num2str(q)]); wolffd@0: wolffd@0: end wolffd@0: end wolffd@0: %disp(['Iterations: ' num2str(iter)]); wolffd@0: %disp(['PR: ' num2str(pr) 'DR: ' num2str(dr)]) wolffd@0: result = V; wolffd@0: end wolffd@0: wolffd@0: wolffd@0: wolffd@0: function result = feasible_symm(A) wolffd@0: result = 0.5*(A+A'); wolffd@0: end wolffd@0: wolffd@0: