Sum of logical vector

(Nora) #1

I am trying to maximize this objective

variable x(n) binary
subject to
    lowerBound <= x <= upperBound
    sum(x) == K

where I want the number of non zero element. This works when I use it with matlab only but it does not work with cvx. instead I get the error:
Error using sum
Invalid data type. First argument must be numeric or logical.

(Mark L. Stone) #2
variable x(n) binary
lowerBound <= x <= upperBound

probably doesn’t make sense because the elements of x can only be zero or one due to x being declared binary.

I guess rhe link I provided you yesterday wasn’t enough of a hint. So I will direct you to the solution at .

(Nora) #3

Thank you for your answer.

actually this is my first time using cvx and I did not understand the pdf in the link quit will. What I need is to maximize the non zero element of a vector I and I couldnt find something similar.

Also, I don’t see how the question in the link related to my problem.

sorry for bothering you but I couldn’t figure it out on my own

(Mark L. Stone) #4

In the linked answer, the elements of Sx > 0 play the role of a > b. So declare a binary vector variable delta(n), whose elements are 1 or 0 according to whether the corresponding element of Xx > 0 or not. Then your objective is maximize(sum(delta)). The linked answer shows you the constraints you will need to include in your CVX program.

You might also want to read in order to better understand Big M.