n = 10;
A = sprandn(2*n,n,.2);
b = randn(2*n,1);
x = sdpvar(n,1);
% Solve some model which typically generates many zeros
optimize([x>=0],norm(A*x-b,1))
value(x)
% BigM constant and zero-margin
M = 10;zeromargin = 0.0005;
% Find all non-zeros
nz = binvar(n,1);
Model = [0 <= x <= M, iff(x >= zeromargin, nz)]
% Find min among those
minnonzero = sdpvar(1);
posofmin = binvar(n,1);
Model = [Model, x-M*(1-posofmin)-M*(1-nz) <= minnonzero <= x+M*(1-nz), sum(posofmin)==1, posofmin <= nz]
% Penalize smallest non-zero
optimize([x>=0,Model],norm(A*x-b,1)+1*minnonzero)
value(x)