I want to minimize $$W\, \text{tr}\left([A-Y_{pie}][A-Y_{pie}]^T\right) + \lambda\Vert A\Vert\, \enspace ,$$ however, I encounter the following problem:

Disciplined convex programming error: Only scalar quadratic forms can be specified in CVX.

Would you like to solve with this, please? Thank you!

Ypie=T*Y; % Y is k*n matrix,T is k*k matrix  ,W is a n*k matrix 



      variable A(K,n)

      minimize (W.*trace((A-Ypie)*(A-Ypie)')+lamda*norm_nuc(A))

  • 2
    $\begingroup$ Does not make sense to minimize a matrix objective. Do you mean $\text{trace} (W...)$ perhaps? $\endgroup$ Nov 10 '14 at 11:10

CVX is not a symbolic analysis engine. Every single subexpression that you construct must satisfy the DCP ruleset. It does not even attempt to consider the entire expression globally.

So in your case, once CVX sees (A-Ypie)*(A-Ypie)', it declares a DCP error. This is proper behavior even though the trace of this quantity is indeed convex. After all, only the diagonal elements of this expression are convex; the rest are non-convex. You're never allowed to construct a non-convex (or non-concave) expression in CVX, even if you end up throwing it away.

To fix this, you have to recognize that this trace quantity is actually the square of the Frobenius norm of A-Ypie. So sum_square(A(:)-Ypie(:)) will do, as will square_pos(norm(A-Ypie,'fro')), or (in CVX 3.0 beta only) norm(A-Ypie,'fro')^2.

Of course, Johan's comment is entirely correct as well, and it's quite possible that none of this advice will apply once you have fixed your model to have a scalar objective.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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