Why am I getting "Your objective function is not a scalar" error?


(Prashant Saikia) #1

This is my code:

load(‘C’)
r=C(:,4);
t=C(:,5);

n = size(C,1);
N = 100;

for i=1:n
eta(i,1) = randn()/2;
end

cvx_begin
variable x

maximize r’*x - t’*x

subject to

  ones(n,1)'*x == N

  x >= zeros(n,1)

  exp(-x/N) >= eta

cvx_end

The objective function should clearly be scalar. But it gives the error, “Your objective function is not a scalar”. What am I doing wrong?

Furthermore, if I write the last constraint as follows:

    for i=1:n
		exp(-x(i,1)/N) >= eta(i,1)
	end

then I get the following error: “Index exceeds matrix dimensions.”


(Mark L. Stone) #2

You have declared the variable x to be a scalar, because you didn’t explicitly specify dimensions in the variable statement. Therefore your objective function winds up being a 1 by n vector, and the index for x is exceeded in the for loop version of your constraints.

I believe you want
variable x(n,1)


(Prashant Saikia) #3

Oh, silly me!

Ok, now after doing the correction you suggested, it gives the following error in the objective function line: “Inner matrix dimensions must agree.” Why is that occurring now?


(Mark L. Stone) #4

It looks like both terms of the objective function should be (1 by n) times (n by 1), which is a scalar. So show your whole program and do a whos just before the objective function. That should show the dimensions on everything including the CVX variable(s). Make sure you didn’t mix up n and N.


(Prashant Saikia) #5

This is what I get when I do a whos:

Name              Size              Bytes  Class      Attributes

  N                 1x1                 8  double               
  C                34x5              1360  double               
  cvx_problem       1x1               544  cvxprob              
  eta              34x1               272  double               
  i                 1x1                 8  double               
  n                 1x1                 8  double               
  r                34x1               272  double               
  t                34x1               272  double               
  x                34x1              2089  cvx  

So, it seems the dimensions should be alright. Can’t figure out why this particular error is showing up.


(Mark L. Stone) #6

Put parentheses around your objective function, which seems to somertimes be needed.
maximize(r'*x-t'*x)

I always use parentheses, as shown in the CVX Users’ Guide. But I believe you can get away with not using them in certain circumstances. I will have to defer to @mcg to make a more definitive statement.


(Prashant Saikia) #7

Gee, thanks Mark! That worked! Good to learn about this best practice.