as I did not find any details about this exact case, here is my question: Is it possible to define a constraint in a function? Since my program is getting bigger, I aimed to implement functions which can be called to either define the constraint in multiple for-loops or use vectorization.
This is a minimal example of my problem
m = 16; n = 8;
A = randn(m,n);
b = randn(m,1);
x_ls = A \ b;
minimize( norm(A*x-b) )
and the function i’m using in this case:
x >= [1; 2; 3; 4; 5; 6; 7; 8];
This is the error message I am getting from CVX.
Incorrect number or types of inputs or outputs for function 'newcnstr'.
Error in >= (line 21)
b = newcnstr( evalin( 'caller', 'cvx_problem', '' ), x, y, '>=' );
Error in constraint (line 4)
out = x >= [1; 2; 3; 4; 5; 6; 7; 8];
Error in test_cvx (line 17)
Maybe you can have a function return a string specifying the constraint, then
eval the string in your main program. Or
There are posts of mine on this forum that do some kind of string eval thing in CVX. Building Functions using CVX - #6 by Mark_L_Stone and Building Functions using CVX - #9 by Mark_L_Stone .
Also look at other posts from Search results for 'eval string' - CVX Forum: a community-driven support forum
Whether any of that is useful to you is another matter.
Thanks. The main benefit in should be to get a more reusable and compact code. Since, the CVX code in the function will be quite complicated in the end, the
eval(...) option would not be very useful.
I have been able to initialize a CVX
expression out(n, 1) and manually set the entries of
x in the function. Afterward, the function will return the expression, and it can be used to construct a constraint in the original script.
expression out(n, 1)
constraint(out, x, n) >= (1:n).';
function f_out = constraint(in, x, n)
for i = 1:n
in(i) = x(i)*i;
f_out = in;
to define a constraint like this
A = (1:n).'
x.*A >= A;
Are there any downsides to a procedure like this in CVX?
You’re in uncharted territory. You’re probably the best qualified to determine if it does what you want.