-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathfindLambdaStar.m
More file actions
45 lines (37 loc) · 845 Bytes
/
findLambdaStar.m
File metadata and controls
45 lines (37 loc) · 845 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function varargout = findLambdaStar(z,w,tau,mu)
% Solves:
% minimize tau*lambda + (1/(2*mu)) * ||[z - lambda*w]_+ ||_2^2
% lambda
% Returns:
% Optimal lambda, objective value
lambdak = (z ./ w)';
[lambdak,idx] = sort(lambdak,'descend');
w = w(idx);
z = z(idx);
g = tau;
i = 0;
ww = 0;
wz = 0;
n = length(lambdak);
while (g > 0) && (i < n)
i = i + 1;
ww = ww + w(i)*w(i);
wz = wz + w(i)*z(i);
if (i < n)
lambda = lambdak(i+1);
else
lambda = 0;
end
g = tau - (wz - lambda * ww) / mu;
end
% Locally we have gradient tau - (1/mu)*(wz - lambda * ww))
% solve for lambda
lambdaStar = max(0, wz - tau*mu) / ww;
c = max(z - w*lambdaStar,0);
obj = tau * lambdaStar + (1/(2*mu)) * (c'*c);
if (nargout == 1)
varargout{1} = obj;
else
varargout{1} = lambdaStar;
varargout{2} = obj;
end