I got the following CVX message


I am a beginner of cvx and trying a SOCP problem using complex_lorentz set, during which I got the following message. When I try a basic SOCP problem with a similar structure, there is no message and cvx gives the solution. Any guess do you have on what is hidden behind the following message ?

??? Subscript indices must either be real positive integers or logicals.
Error in ==> cvx_extract at 344
tmpv = sum(dbcA(temp,:)~=0,2)==1;
Error in ==> cvx_solve at 26
[ At, cones, sgn, Q, P, exps, dualized ] = cvx_extract( shim.config, shim.name );
Error in ==> cvx_finish at 57
[ status, result, bound, iters, tol ] = cvx_solve;
Error in ==> cvx_end at 11
evalin( ‘caller’, ‘cvx_finish’ );
Error in ==> test at 165

This looks like a bug; you should submit a bug report to the issue tracker and make sure to include the full version information (the output of cvx_version, basically) and enough of your model to reproduce the problem.

That said: why are you trying to use complex_lorentz? Why don’t you just use norm()?


Thanks for the fast answer.

I tried norm( ) and cvx said I am violating DCP rule since both sides of an inequality are convex functions. When I use complex_lorentz set, I could avoid such violation but met another message as posted above. Below is the cvx code I used to test using the complex_lorentz set and it worked fine. The code which generates above mentioned message uses affine mapping for the expression holders t and tt from the defined variables.

    variable x(m) complex;
    variable y complex;
    expression t(m);
    expression tt(1);
    subject to
       tt =y;
        for k=1:m
            t(k,1) = x(k);
        imag(y) == 0;
        { t,  tt } == complex_lorentz(m);

Nonlinear equality constraints are not allowed, so CVX was right to reject it. It is curious that you would declare y to be complex and then constrain its imaginary part to be real; why not declare it to be real? In fact the entire constraint have constructed looks like it will do nothing. It is equivalent to norm(x)<=real(y). But y is unconstrained.

What was your original problem, the one that CVX rejected? Perhaps what you are really trying to achieve is nonconvex; if so all of this effort is moot.


The problem I am working on is beamforming in wireless communications, which tries to minimize the transmit power while keeping the signal to interferece power ratios at a set of levels. So, the entries of vector t and scalar tt are signal componets having complex values. To keep tt real in the complex_lorenz set, we phase rotate y so that the imaginary part of y is zero.

That does not answer my question about the original model. Many wireless models are nonconvex. I cannot help further I am afraid. There may be a bug with complex_lorentz but there is absolutely no situation where it will work but norm cannot. Go back to norm and diagnose the real problem with your model.