CVX模型
function s=GroupSparse_cvx(z,phi,block_num,ebisilon)
[row,col]=size(phi);
N=col/block_num;
M=row/block_num;
phi_block=zeros(M,N,block_num);
z_block=zeros(M,block_num);
for nn=1:block_num
phi_block(:,:,nn)=phi((nn-1)*M+1:nn*M,(nn-1)*N+1:nn*N);
z_block(:,nn)=z((nn-1)*M+1:nn*M);
end
cvx_begin sdp
variable S(N,block_num) complex
variable data_error(block_num,1)
for mm=1:block_num
data_error(mm)=norm(z_block(:,mm)-phi_block(:,:,mm)*S(:,mm));
end
minimize norms(S,2,1)
subject to
sum(data_error)<=ebisilon;
cvx_end
s=reshape(S.',[],1);
end
报错信息
The following cvx variable(s) have been cleared or overwritten:
data_error
This is often an indication that an equality constraint was
written with one equals '=' instead of two '=='. The model
must be rewritten before cvx can proceed.
解决方案
将问题上传至CVX论坛后得到解答,问题来自于这里我是希望data_error作为一个辅助变量储存多个二范数计算结果。但是我却定义了它。但是根据CVX 用户手册里的说明,在CVX模型中待优化的变量是不能被重写或者赋值的。故而CVX工具箱看到我将二范数赋值给data_error就理解成我写的应该是一个约束,建议我使用*==*。
实际上我希望data_error是执行一个计算二范数的操作,并不是一个去求解data_error。所以这里应该使用expression去声明data_error。因为CVX模型中expression是可以被重写或者赋值的,相当于将一个施加于变量的函数或者说操作赋给了该expression。