CVXGEN程序的任意维度

时间:2016-09-29 19:42:06

标签: matlab mathematical-optimization hessian-matrix cvx

我想使用MatLab解决CVXGEN中的QP / LP问题。我优先选择CVXGEN而不是CVX,因为CVXGEN要快得多。特别是,我想解决

min f(x) s.t. x in X

其中f(x)是二次形式,X是紧凑的,凸的,并由线性函数定义。问题的大小因运行而异。我想尽可能自动化程序。为了说明,CVXGEN代码的示例是:

dimensions
  n = 10  
end

parameters
  Q (n,n) psd  # quadratic penalty.
end

variables
  x (n)
end

minimize
  quad(x, Q)
end​​​​​​​​​​​​​

此代码在cvxgen.com输入。在这个网站上,我可以生成C代码,它给我一个唯一的编号。然后我可以使用唯一编号将其编译为MEX代码。最后,我可以通过运行以下代码

从MatLab调用此MEX代码(csolve
n=10; % dimension of the problem
params.Q = eye(n,n); % assume that the Hessian is the identity
[vars, status] = csolve(params); % this outputs optimal x* = 0.

但是,此过程需要我要运行的问题n的每个维度,我需要转到cvxgen.com,更改n,编译代码,然后运行我的MatLab代码。是否可以让n作为参数输入?这样,我只需要编译一次代码,然后在我的MatLab代码集params.n = nparams.Q = eye(n,n)中编译,然后调用[vars, status] = csolve(params);

1 个答案:

答案 0 :(得分:0)

简而言之,我认为不可能在cvxgen.com上指定任意维度。我有一个解决方案:首先,在MatLab中,允许用户为cvxgen.com指定他/她的电子邮件地址和密码。接下来,使用system中的MatLab命令,调用执行以下步骤的pythonjavascript程序:

1)将用户登录到cvxgen.com

2)转到网站上的edit标签

3)复制并粘贴cvxgen代码

4)转到generate c标签

5)点击generate code

6)转到matlab标签

7)复制要下载的已编译C代码的唯一标识号

8)将唯一识别号码传回MatLab并通过拨打识别号码编译Mex中的MatLab个文件。

现在可以通过以下命令在Mex中调用MatLab个文件:

n=10; % dimension of the problem
params.Q = eye(n,n); % assume that the Hessian is the identity
[vars, status] = csolve(params); % this outputs optimal x* = 0.