www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xreg3xspline/set.m
function m = set(m,prop,value) %SET Overloaded set function for xreg3xspline % % Value= get(m,'Property') % Properties % 'symbol' Factor Labels % 'order' Factor Order % 'knots' Knot Position (in (-1,1)). % 'naturalknots' Raw knots % 'interact' Interaction Level % 'spline' Index to Spline Variable % Copyright 2000-2007 The MathWorks, Inc. and Ford Global Technologies, Inc. switch lower(prop) case 'knots' Tgt=gettarget(m,m.splinevar); if any(value<=Tgt(1) | value>=Tgt(2)) error(message('mbc:xreg3xspline:InvalidValue')) end nk= length(m.knots); m.knots= sort(value(:)'); if length(m.knots) ~= nk nterms=i_countterms(m); m= update(m,(1:nterms)'); end case 'naturalknots' i=m.splinevar ; [L,U]=range(m); if any(value<L(i) | value>U(i)) error(message('mbc:xreg3xspline:InvalidValue')) end K= code(m,value(:),i); nk= length(m.knots); m.knots= K(:)'; if length(m.knots) ~= nk nterms=i_countterms(m); m= update(m,(1:nterms)'); end case 'interact' ni= m.interact; m.interact= value; if m.interact ~= ni nterms=i_countterms(m); m= update(m,zeros(nterms,1)); end case 'spline' % change spline variable % Knots are kept in their coded positions. % Need to reassemble label and orders from xregcubic and here, then redistribute if value==m.splinevar return end nf=nfactors(m); if value>0 && value<=nf symb=get(m,'symbol'); ord=get(m,'order'); oldsplord=m.poly_order; m.splinevar=value; m.poly_order=ord(value); ord(value)=[]; symb(value)=[]; m.cubic=xregcubic(ord,symb); o3= reorder(m.cubic); i=m.splinevar ; o3(o3>=i)= o3(o3>=i)+1; % insert spline variable in correct position m.reorder = [i o3]; if m.poly_order~=oldsplord % update xreglinear nterms=i_countterms(m); m= update(m,zeros(nterms,1)); end end case 'order' if any(value>3) || any(value<0) return end nf=nfactors(m); if length(value)~=nf return end splord=value(m.splinevar); value(m.splinevar)=[]; % update data m.poly_order=splord; symb=get(m.cubic,'symbol'); % reconstruct xregcubic m.cubic=xregcubic(value,symb); o3= reorder(m.cubic); i=m.splinevar ; o3(o3>=i)= o3(o3>=i)+1; % insert spline variable in correct position m.reorder = [i o3]; % update xreglinear nterms=i_countterms(m); m= update(m,(1:nterms)); case 'numknots' nk= value; [L,U]=range(m); k= linspace(L(m.splinevar),U(m.splinevar),nk+2); m= set(m,'naturalknots',k(2:end-1)); otherwise % Call parent set m.xreglinear= set(m.xreglinear,prop,value); end if nargout==0 assignin('caller',inputname(1),m) end function len=i_countterms(m) Ns= length(m.knots) + m.poly_order + 1; N=order(m.cubic); % PHI Terms len= Ns; for i=1:N(1) if m.interact>=1 % Xi * PHI terms len = len + Ns; else % Xi * [1 X1 X1^2] terms len=len+3; end for j=i:N(2) if m.interact>=2 % Xi * Xj * PHI terms len = len + Ns; else % Xi * Xj * [1 X1] terms len=len+2; end for k=j:N(3) % Xi * Xj * Xk terms len=len+1; end end end return