Rank minimization with TFOCS

Here’s a solution for some of the formulations (e.g., A*vec(X) ~= b), with the CVX code and the TFOCS code:

n = 10;
m = round(n/2);
A = randn(m,n^2);
b = randn(m,1);
epsilon = .1;

%% Solve in CVX
cvx_begin
  cvx_precision best
  variable X(n,n)
  minimize trace(X)
  subject to
    X == semidefinite(n)
    norm( A*vec(X) - b, Inf ) <= epsilon
cvx_end
X_CVX = X;
%% Solve in TFOCS
linear  = linop_compose( linop_matrix(A), linop_vec([n,n]) );
affneF = { linear, -b };
objectiveF   = prox_trace;
dualproxF    = prox_l1(epsilon);
mu           = 0.1;
opts = struct('tol',1e-6,'maxIts',100);
opts.errFcn = @(fcn,dual,primal) norm( primal-X_CVX,'fro');
opts.continuation   = true;
x0   = zeros(n,n);
z0   = [];
[X,out,opts] = tfocs_SCD( objectiveF, affineF, dualproxF, mu, x0, z0, opts );
1 Like