www.gusucode.com > rctlmi 工具箱 matlab源码程序 > rctlmi/private/mkterm.m
% called by LMIEDIT % Authors: P. Gahinet and A. Nemirovski 3/95 % Copyright 1995-2004 The MathWorks, Inc. function term = mkterm(A,B,X,vt,flag) if strcmp(B(1),'$'), B(1)=[]; sym=mkterm(A,B,X,vt,~flag); else sym=[]; end % add parentheses when A and B involve operands mA=strcmp(A(1),'-'); lA=length(A); depth=0; dmap=zeros(lA,1); if mA, j=1; dmap(1)=1; else j=0; end for char=A(1+mA:lA)', depth=depth+any(char=='[('); j=j+1; dmap(j)=depth; depth=depth-any(char=='])'); end minA=min(dmap); % 1 if surrounding () or [] if lA-mA>2 & ~minA, if length(find(~dmap & (A=='+' | A=='-' | A=='*' | A=='\' | A=='/'))), A=['(' ; A ; ')']; mA=0; end end mB=strcmp(B(1),'-'); lB=length(B); depth=0; dmap=zeros(lB,1); if mB, j=1; dmap(1)=1; else j=0; end for char=B(1+mB:lB)', depth=depth+any(char=='[('); j=j+1; dmap(j)=depth; depth=depth-any(char=='])'); end minB=min(dmap); % 1 if surrounding () or [] if lB-mB>2 & ~minB, if length(find(~dmap & (B=='+' | B=='-' | B=='*' | B=='\' | B=='/'))), B=['(' ; B ; ')']; mB=0; end end % handle minus sign if mA, A(1)=[]; end if mB, B(1)=[]; end isminus=xor(mA,mB); lA=length(A); lB=length(B); X=X(:); if flag, % form (A*X*B)' if vt(1) | vt(2), term=X; else term=[X;'''']; end if strcmp(A,'1'), elseif any(A(1)=='1234567890.'), term=[term;'*';A]; elseif minA, % surrounding () or [] term=[term ; '*' ; A ; '''']; elseif strcmp(A(lA),''''), A(lA)=[]; term=[term;'*';A]; else term=[term;'*';A;'''']; end if strcmp(B,'1'), elseif any(B(1)=='1234567890.'), term=[B;'*';term]; elseif minB, term=[B;'''';'*';term]; elseif strcmp(B(lB),''''), B(lB)=[]; term=[B;'*';term]; else term=[B;'''' ; '*';term]; end else if ~vt(1) | vt(2), term=X; else term=[X;'''']; end if ~strcmp(A,'1'), term=[A; '*' ;term]; end if ~strcmp(B,'1'), term=[term ; '*' ; B]; end end if isminus, term=['-';term]; end if length(sym), if isminus, term=[term;sym]; else term=[term;'+';sym]; end end