www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@contable1/designconstraint.m
function p = designconstraint(c,p) %DESIGNCONSTRAINT command-line design constraint properties % % p = designconstraint(c,p) % Copyright 2007-2013 The MathWorks, Inc. p = addprop(p,'Table',... @iGetZ,... @iSetZ,... 'vector','',... 'Table constraint'); p = addprop(p,'Breakpoints',... @iGetX,... @iSetX,... 'vector','',... 'Breakpoints for rows'); cif = getInputFactors( c ); fact = getSymbols( cif ); p = addprop(p,'Inequality',... @iGetlt,... @iSetlt,... 'enum',{'<=','>='},... 'Relational Operator'); p = addprop(p,'InputFactor',... @iGetXFactor,... @iSetXFactor,... 'enum',fact,... 'Column input symbol'); p = addprop(p,'TableFactor',... @iGetZFactor,... @iSetZFactor,... 'enum',fact,... 'Table input symbol'); function v = iGetZ(con) v = con.table; function con = iSetZ(con,v) con.table= v(:)'; if length(v)~=length(con.breakcols) con.breakcols = linspace(con.breakcols(1),con.breakcols(end),size(v,1)); end function con = iSetX(con,v) if length(v)<length(con.table) con.table = con.table(1:length(v)); else con.table(length(con.table+1):length(v)) = con.table(end); end con.breakcols = v(:)'; function v = iGetX(con) v = con.breakcols; function v = iGetlt(con) if con.le v = '<='; else v = '>='; end function con = iSetlt(con,v) con.le = double(strcmp(v,'<=')); function v = iGetXFactor(con) cif = getActiveFactors( con ); fact = getSymbols( cif ); v = fact{ 1 }; function con = iSetXFactor(con,v) con = iChangeFactor(con,1,v); function v = iGetZFactor(con) cif = getActiveFactors( con ); fact = getSymbols( cif ); v = fact{ 2 }; function con = iSetZFactor(con,v) con = iChangeFactor(con,2,v); function obj = iChangeFactor(obj,Index,newval) cif = getInputFactors( obj ); nf = length(cif); fact = getSymbols( cif ); FactIndex = getActiveIndices(obj); OldFact = fact(FactIndex); if ~strcmp(newval,OldFact{Index}) NewIndex = find( strcmp( newval,fact ) ); factind2 = find( strcmp( newval,OldFact ) ); if ~isempty(factind2) % change another variable so that each factor used only once avail = setdiff(1:nf, FactIndex((1:2)~=Index)); FactIndex(factind2) = avail(1); end FactIndex(Index) = NewIndex; obj = setActiveIndices(obj, FactIndex); % now sort out table for new factors [xB, zV] = getTable(obj); R = getRange(cif); for i = 1:length(FactIndex) n = FactIndex(i); switch i case 1 xB = linspace(R(1, n), R(2, n), length(xB)); case 2 [~, ineq] = getRelation( obj ); if ineq==1 zV = repmat(R(2,n), size(zV)); else zV = repmat(R(1,n), size(zV)); end end end obj = setTable(obj, xB, zV); end