从 cvx 转换为 double 时出现以下错误:无法从 cvx 转换为 double。

时间:2024-03-30 18:31:41

初学cvx,今天在做一个仿真时,出现了“无法从 cvx 转换为 double。”这个错误,我是中文版的,英文版的应该表达为“Conversion to double from cvx is not possible.”类似的。

从 cvx 转换为 double 时出现以下错误:无法从 cvx 转换为 double。

我原来的代码大概是这个的:

z=zeros(1,K);

cvx_begin sdp

variable x;

maximize t;

subject to

       for n=1:K

              z(n)=Ax+b;

       end

z(n)>=t;

cvx_end

意思就是在constriant中要做一个和运算,而这个和运算是包有变量的,所以不可能在cvx外面完成,所以需要一个中间变量z来存着,而一开始我把z的声明放在外面,这样就是会产生数据从cvx类型存到double(外面是double的)的过程。后来我把z当作一个variable变量,将声明放到cvx内部

从 cvx 转换为 double 时出现以下错误:无法从 cvx 转换为 double。

就又出现了overwrite的问题,因为如果把z当作变量,则它是一个可以变动的变量,其值是动态的,如果对其用“=”号赋值了,就改变了cvx在做运算的值,这是不允许覆盖的。后来,查了网上一些网友的资料才知,在cvx内部可以声明专用的中间变量类型来临时使用的。也就是expression的作用:

从 cvx 转换为 double 时出现以下错误:无法从 cvx 转换为 double。

cvx中的variable变量不是允许人为赋值的,只有在最后得出结果才会被结果覆盖,而expression变量是可以使用“=”的临时变量,在完成cvx后其值清零。

cvx_begin sdp

variable x;

expression z(1,K);

maximize t;

subject to

       for n=1:K

              z(n)=Ax+b;

       end

z(n)>=t;

cvx_end

 PS:以上cvx例程只作临时表达作用,不作严谨使用。