6
$\begingroup$

I am trying to reconstruct a positive sparse signal using compressed sensing (friedlanders code), I cannot find a way to impose the positivity constraint for this implementation. I have seen some papers discussing positive signals case but cannot find any code implementations, can anyone please point out to any relevant code.

$\endgroup$
3
  • $\begingroup$ Does it matter which programming language? Python, Matlab, etc.? $\endgroup$ Commented Nov 7, 2017 at 5:21
  • $\begingroup$ nope, anything is fine $\endgroup$
    – Pavan
    Commented Nov 8, 2017 at 8:55
  • $\begingroup$ @Pavan, Could you mark my question? $\endgroup$
    – Royi
    Commented Mar 2, 2020 at 14:06

2 Answers 2

3
$\begingroup$

SparseLab should be able to solve the positivity-constrained problem: SparseLab (Stanford) - Seeking Sparse Solutions to Linear System of Equations.

See Donoho & Tanner, "Precise Undersampling Theorems" for a definition of the problem.

This toolbox depends on Matlab.

$\endgroup$
2
  • $\begingroup$ thank you very much, this is what I was looking for, esp. the non-negative fourier example $\endgroup$
    – Pavan
    Commented Nov 27, 2017 at 16:37
  • $\begingroup$ @Pavan you're welcome. Consider voting the answer up. $\endgroup$ Commented Nov 28, 2017 at 17:07
2
$\begingroup$

I assume you're after the following optimization problem:

$$\begin{align*} \arg \min_{x} \; & {\left\| x \right\|}_{1} \\ \text{subject to} \; & A x = b \\ & x \succeq 0 \end{align*}$$

This is pretty simple problem if we pay attention fo the fast that given $ x \succeq 0 $ then $ {\left\| x \right\|}_{1} = \boldsymbol{1}^{T} x $.

This means the above problem is equivalent of:

$$\begin{align*} \arg \min_{x} \; & \boldsymbol{1}^{T} x \\ \text{subject to} \; & A x = b \\ & x \succeq 0 \end{align*}$$

Now, this is a Linear Programming problem which can be easily solved using MATLAB or any other LP solver.

For instance, in MATLAB it will be something like that:

numRows = 10;
numCols = 100;

mA = randn([numRows, numCols]);
vB = randn([numRows, 1]);

vE = ones([numCols, 1]); %<! Vector of ones to sum vX

vX = linprog(vE, [], [], mA, vB, zeros([numCols, 1]), inf([numCols, 1]));
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.