Here, S is a given matrix, T is a known positive number

D is a known column vector

Lets say, K=32768 and T=4

```
cvx_begin
variable x(K,1) integer
minimize( power(2,norm(D.'-V,2)) )
subject to
V == (1/T)*sum(S.*x);
sum(x)== T;
cvx_end
```

I am using MOSEK and Get an error as “Invalid variable specification: x(K,1)integer”

If `K`

really does equal 32768,

`variable x(K,1) integer`

should be accepted by CVX.

@Mark_L_Stone, Unfortunately, I am getting the same error!

Perhaps K isn’t being set properly.

What does

`whos K`

show? What does `disp(K)`

show?

Or maybe your MATLAB session got corrupted. Try starting from a new MATLAB session.

@Mark_L_Stone, disp(K) shows 32768. Anyway, below is the code I am using now,

```
cvx_solver Mosek
N=15;
K=2^N;
S=randi([5 10],K,N).*fliplr(de2bi((0:K-1)'));
OptS=[2^1 2^(N-2) 2^(N-1) 2^N];
N_TS=length(OptS);
D=((sum(S(OptS,:)))/N_TS)';
cvx_begin
variable x(K,1)integer
minimize(power(2,norm(D.'-V,2)))
subject to
V == (1/N_TS)*sum(S.*x);
sum(x)== N_TS;
cvx_end
```

You need to fix this up and show a clean code, with no typos. Your code is missing the “n” at the end of dec2bin.

And most crucially, in your most recent post, there is no space between

`x(K,1)`

and

`integer`

As written, this produces the exact error message you received If a space is inserted before `integer`

, that line is accepted by CVX. You are making it difficult for people to diagnose your problems, because in your first post, there is a space before `integer`

, hence that runs without error.

@Mark_L_Stone, I think “de2bi” is correct.

Typing…help de2bi in matlab gives

de2bi Convert decimal numbers to binary numbers.

B = de2bi(D) converts a nonnegative integer decimal vector D to a

binary matrix B. Each row of the binary matrix B corresponds to one

element of D. The default orientation of the binary output is

Right-MSB; the first element in B represents the lowest bit.

Yes, unfortunately, I didnot put space between … and integer.

Hopefully your problem is now resolved.

As for dec2bi , that produced an error message for me. I see now that it is in Communications System toolbox, which I don’t have, hence my error message…

@Mark_L_Stone, Unfortunately, no. Now, I get…

Undefined function or variable ‘V’.

Didn’t you get this error?

If I instead replace V with its equivalent term itself, it shows…

```
cvx_begin
variable x(K,1) integer
minimize( power(2,norm(Demand.' - (1/N_TS)*sum(S.*x), 2)))
subject to
sum(x)== N_TS;
cvx_end
```

But if S is a matrix of size (32768 X 15) and x is a column vector of size (32768 X 1), sum(S.*x) should work fine.

Error using .* (line 46)

Matrix dimensions must agree.

If you never declared or set `V,`

then it will be undefined and produce an error.

Do you want `sum(S'*x)`

? That is dimensionally consistent `S.*x`

is not dimensionally consistent in CVX (note that the new construct in MATLAB R2016b described in https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/ is not supported in CVX, i.e., for CVX expressions).

@Marc_L_Stone, Thank you very much.

Let,

S=[1 2 3 4;2 3 4 5; 3 4 5 6];

x=[1; 2; 3];

In my definition

S.*x=[1 2 3 4;4 6 8 10;9 12 15 18]

sum(S.*x)=[14 20 26 32]

That is I want to have

sum(S(i,:)*x(i)), i=1 to 32768 when S (32768 X 15) and x (32768 X 1)

That is the i’th row vector of S is multiplied by the i’th element in x. So, all the elements of the i’th vector is multiplied by the same number which is the i’th element in vector x.

It looks like

`sum(S.*repmat(x,1,15))`

will do what I think (but am not sure) you want.

Or more simply,

`x'*S`

In your example, using 4 instead of 15, these both come out to [14 20 26 32] .

At this point, I think you are just dealing with matters of MATLAB syntax, not really CVX. So you may need to brush up on MATLAB.

1 Like