www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@contable2/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',... @iGetTableData,... @iSetTableData,... 'matrix','',... 'Table constraint'); p = addprop(p,'RowBreakpoints',... @iGetRowBreakpoints,... @iSetRowBreakpoints,... 'vector','',... 'Breakpoints for rows'); p = addprop(p,'ColumnBreakpoints',... @iGetColumnBreakpoints,... @iSetColumnBreakpoints,... 'vector','',... 'Breakpoints for columns'); p = addprop(p,'Inequality',... @iGetlt,... @iSetlt,... 'enum',{'<=','>='},... 'Relational operator'); cif = getInputFactors( c ); fact = getSymbols( cif ); p = addprop(p,'RowFactor',... @iGetRowFactor,... @iSetRowFactor,... 'enum',fact,... 'Row input symbol'); p = addprop(p,'ColumnFactor',... @iGetColumnFactor,... @iSetColumnFactor,... 'enum',fact,... 'Column input symbol'); p = addprop(p,'TableFactor',... @iGetTableFactor,... @iSetTableFactor,... 'enum',fact,... 'Table input symbol'); function v = iGetTableData(con) v = con.table; function con = iSetTableData(con,v) con.table= v; if size(v,1)~=length(con.breakrows) con.breakrows = linspace(con.breakrows(1),con.breakrows(end),size(v,1)); end if size(v,2)~=length(con.breakcols) con.breakcols = linspace(con.breakcols(1),con.breakcols(end),size(v,2)); end function con = iSetRowBreakpoints(con,v) if size(con.table,1)<length(v) con.table = [con.table zeros(size(con.table)-[length(v),0])]; else con.table = con.table(1:length(v),:); end con.breakrows = v; function v = iGetRowBreakpoints(con) v = con.breakrows; function v = iGetColumnBreakpoints(con) v = con.breakcols; function con = iSetColumnBreakpoints(con,v) if size(con.table,2)<length(v) con.table = [con.table zeros(size(con.table)-[0 length(v)])]; else con.table = con.table(:,1:length(v)); end con.breakcols = v; function v = iGetlt(con) if con.le v = '<='; else v = '>='; end function con = iSetlt(con,v) con.le = double(strcmp(v,'<=')); function v = iGetRowFactor(con) cif = getActiveFactors( con ); fact = getSymbols( cif ); v = fact{ 2 }; function con = iSetRowFactor(con,v) con = iChangeFactor(con,2,v); function v = iGetColumnFactor(con) cif = getActiveFactors( con ); fact = getSymbols( cif ); v = fact{ 1 }; function con = iSetColumnFactor(con,v) con = iChangeFactor(con,1,v); function v = iGetTableFactor(con) cif = getActiveFactors( con ); fact = getSymbols( cif ); v = fact{ 3 }; function con = iSetTableFactor(con,v) con = iChangeFactor(con,3,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:3)~=Index)); FactIndex(factind2) = avail(1); end FactIndex(Index) = NewIndex; obj = setActiveIndices(obj, FactIndex); % now sort out table for new factors [xB, yB, 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 yB = linspace(R(1, n), R(2, n), length(yB)); case 3 [~, ineq] = getRelation( obj ); if ~isequal(size(zV),[length(xB),length(yB)]) if ineq==1 zV = repmat(R(2,n), [length(xB),length(yB)]); else zV = repmat(R(1,n),[length(xB),length(yB)]); end end end end obj = setTable(obj, xB, yB, zV); end