www.gusucode.com > rctlmi 工具箱 matlab源码程序 > rctlmi/mat2dec.m
function decvars=mat2dec(LMIsys,varargin) % MAT2DEC Construct decision variables vector from matrix variable values % % DECVARS = MAT2DEC(LMISYS,X1,X2,X3,...) takes an LMI system LMISYS and % values X1,...,XN of its matrix variables and builds the corresponding % vector DECVARS of decision variable values. % % See also DEC2MAT, DECINFO, DEFCX. % Authors: P. Gahinet and A. Nemirovski 3/95 % Copyright 1995-2004 The MathWorks, Inc. if nargin < 2, error('usage: decvars = mat2dec(lmisys,X1,X2,X3,...)'); elseif nargin > 21, error('MAT2DEC accepts only up to 20 matrix variables'); elseif size(LMIsys,1)<10 || size(LMIsys,2)>1, error('LMISYS is an incomplete LMI system description'); elseif any(LMIsys(1:8)<0), error('LMISYS is not an LMI description'); end [~,LMI_var]=lmiunpck(LMIsys); nvars=size(LMI_var,2); if ~nvars, error('No matrix variable defined in LMISYS'); elseif nargin-1 ~= nvars, error('There should be %d matrix variables in the calling list',nvars); end ldec=decnbr(LMIsys); decvars=Inf(ldec,1); % Inf to keep track of what is already instantiated for k=1:nvars, var = LMI_var(:,k); X = varargin{k}; type=var(2); base=var(3); % base first dec var last=var(4); % last dec var row=var(5); col=var(6); % check dimensioning consistency if size(X,1)*size(X,2)==1, % Xk = scalar if row==col, X=X*eye(row); elseif X==0, X=zeros(row,col); else error(['The argument X',num2str(k),' cannot be a scalar!']); end elseif size(X,1)~=row || size(X,2)~=col, error(['The argument X',num2str(k),' is not properly dimensioned!']); end if type==1, dec=[]; rcb=0; for l=1:var(7), bsize=var(6+2*l); btype=var(7+2*l); if btype==1, % block type = 1 dec=[dec;ma2ve(X(rcb+(1:bsize),rcb+(1:bsize)),1)]; %#ok<*AGROW> elseif btype==0, dec=[dec;X(rcb+1,rcb+1)]; end rcb=rcb+bsize; end decvars(base+1:last)=dec; elseif type==2, decvars(base+1:last)=ma2ve(X,2); else struct=var(7:6+row*col); Xvec=X'; Xvec=Xvec(:); ind=find(abs(struct)>0); struct=struct(ind)'; Xvec=Xvec(ind)'; for t=[struct;Xvec], n=abs(t(1)); if decvars(n)==Inf, decvars(n)=sign(t(1))*t(2); end end end % check structure consistency lmitmp=lmipck([],var,[],[]); lmitmp(8)=ldec; Xs=dec2mat(lmitmp,decvars,var(1)); if norm(X-Xs,1) > eps^(3/4)*norm(X,1), error(['The argument X',num2str(k),' is not properly structured']); end end ind=find(decvars==Inf); decvars(ind)=zeros(length(ind),1);