Disciplined error:Cannot multiply complex affine by a convex function

I’m trying to maximize the following concave objective under some convex constraints in CVX:

-\text{tr}(\textbf{L}\textbf{L}^H)-\text{tr}(\mathbf{\Lambda}^H \mathbf{\Sigma}^{-1} \mathbf{\Lambda}(\textbf{R}+\textbf{G}{\textbf{L}}{\textbf{L}}^H\textbf{G}^H))-\text{tr}(\mathbf{\Sigma}^{-1}) \\ +2\Re(\text{tr}(\mathbf{\Sigma}^{-1}\mathbf{\Lambda}\textbf{G} \textbf{L}))-\log_2|\mathbf{\Sigma}|

where \mathbf{\Lambda}, \mathbf{\Sigma},\textbf{R} and \textbf{G} are complex constant matrices, and \textbf{L} is the optimization variable. Here is how I implement it in CVX

maximize(-trace(square_pos(norm(L,'fro'))-real(-trace(lam'*inv(sig)*lam*(R+(G*(square_pos(norm(L,'fro')))*G')))-trace(inv(sig)) ...

The problem is that CVX returns the following error:

Disciplined convex programming error:
Cannot perform the operation: {complex affine} .*

My questions are:

1- in DCP rule set, the multiplication of a concave with a non-negative constant is a valid expression, so why this error happened ?

2- Does CVX allows variable substitution of variables that are function of the optimization variables, i.e., can i define
\textbf{Z}=(\textbf{R}+\textbf{G}{\textbf{L}}{\textbf{L}}^H\textbf{G}^H) and use it in the objective and still have the same optimal solution ? This replacement solves the issue but i think CVX will treat \textbf{Z} as a constant despite its clearly a function of \textbf{L}.

3- This error appears also if all the matrices are scalars. For some reasons, I can’t make a substitution of the quadrature form like \textbf{K}=\textbf{L}\textbf{L}^H and perform the optimization over \textbf{K} which solves the problem.

Best wishes,

I’m assuming G is complex. And indeed, CVX is correct, you cannot multiply a convex expression by a complex number or matrix.

And I’m not convinced that your formulation accurately reflects the formula. Is L a matrix? If so, then LL^H is not a scalar, so your term G*(square_pos(norm(L,'fro')))*G' is not a valid way to express that particular part of the problem.

I actually think this may be convex, but you haven’t proven it. If you can come up with the proof—I’m thinking in terms of Schur complements and LMIs—then you will not be able to solve this in CVX.

Thanks Michael,

Yes, G is a channel matrix which usually assumed to be a complex Gaussian matrix.

In general L is a matrix, but why this form is not valid ? I know that CVX is accepting only a scalar quadratic form in its pure form, but this one is implemented as a norm squared. Please let me know about a valid way to implement this expression.

The expression is convex with respect to \mathbf{L} for given \Sigma and \Lambda. If I understand your point correctly, how can we make use of proving it with LMI in overcoming this problem; I know this is helpful if we are talking about a constraint, but this is an objective function.

Thanks again,

It’s not valid because it is not equivalent to your LaTeX formula. LL^H is not a scalar; square_pos(norm(L,'Fro')) is a scalar.

I don’t have an answer for you on how to fix this, as I just don’t have the time to do other people’s modeling work. (I don’t mean for that to sound mean! It’s just the truth, my paying work has to take priority!) Perhaps others can help there.

It doesn’t matter whether this is a constraint or an objective function, you still have to be able to prove convexity using principles that are compatible with the DCP ruleset. If you can’t, you can’t use CVX. Whenever you have an objective f(x) that you need to convert to DCP compliance, just think of it as converting the constraint f(x)\leq t instead. (Or f(x)\geq t if f is concave).

In the process of solving the previously stated problem, I define and implement the the following steps using Schur complement and LMI:

1-- Define the problematic quadratic expression as an optimization variable:
\mathbf{X}=\mathbf{GLL'G'} and replace the occurrence of this term by \mathbf{X} in objective and constraint.

2-- Since it is a maximization problem, I add the following constraint for the newly added variable:
\mathbf{X} >= \mathbf{GLL'G'}

3- Implement the above constraint in CVX as:
[(X) (G*L);(L'*G') eye(n)] == hermitian_semidefinite(2*n);

The problem is that i didn’t get equal values of the variable X and its explicitly calculated value, i.e. \mathbf{GLL'G'} at the end of optimization.

Do you think something wrong with the implementation and/or the approach ?


Hi Michael,
Can I use MATLAB command ‘gmultiply’ in CVX, if not, then is there any command that i can use for the purpose or any other suggestion. Thanks

1 Like

You can use
but it must comply with all DCP rules.