www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@localmod/ModelClasses.m
function ud= ModelClasses(L,ExpandLinear) %MODELCLASSES list of available classes % % ud= ModelClasses(L,nf) % L localmod % nf number of input factors % % Output Structure % ud.fCreate class constructor function handle % ud.DisplayName Display String for Model % ud.Group % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. nf= nfactors(L); if nargin<2 ExpandLinear = false; end if nf==1 % builtin classes for one input factor ud.fCreate={@localpoly,@localpspline,@localtruncps,@localbspline}; ud.DisplayName= {'Polynomial','Polynomial spline','Truncated power series','Free knot spline'}; ud.Group= cellfun(@func2str,ud.fCreate,'UniformOutput',false); else ud.fCreate= {}; ud.DisplayName= {}; ud.Group = {}; end if nf==1 % Growth Models ud.fCreate= [ud.fCreate {@localgrowth}]; ud.DisplayName = [ud.DisplayName {'Growth models'}]; ud.Group = [ud.Group {'Growth'}]; end if ExpandLinear % list of linear models is defined here hLin = xregLinearClasses; for i=1:length(hLin.fCreate) % expand the creation routine to make a fLin = hLin.fCreate{i}; h.fCreate{i} = @(prop,nf) localsurface(fLin('nfactors',nf)); h.DisplayName{i} = ['Local ',hLin.DisplayName{i}]; h.Group{i} = 'localsurface'; end else % the choice of which linear model is made lower down in GUI h.fCreate= {@localsurface}; h.DisplayName= 'Linear models'; h.Group= 'localsurface'; end % General Models ud.fCreate= [ud.fCreate h.fCreate {@localavfit}]; ud.DisplayName = [ud.DisplayName h.DisplayName {'Average fit'}]; ud.Group = [ud.Group h.Group {'localavfit'}]; % user-defined models cfglist=getmodellist(xregusermod,nf); if ~isempty(cfglist) ud.fCreate= [ud.fCreate {@localusermod}]; ud.DisplayName = [ud.DisplayName {'User-defined models'}]; ud.Group = [ud.Group {'xregusermod'}]; end % transient models cfglist=getmodellist(xregtransient,nf); if ~isempty(cfglist) ud.fCreate= [ud.fCreate {@localtransient}]; ud.DisplayName = [ud.DisplayName {'Transient models'}]; ud.Group = [ud.Group {'xregtransient'}]; end % structure defining additional classes from extensions ext = mbcextensions.Extensions.Model; mdl_ext= ext.LocalModelClasses; if ~isempty(mdl_ext) && ~isfield(mdl_ext,'fCreate') % upgrade to new fieldnames [mdl_ext.fCreate] = deal(mdl_ext.classfuncs); [mdl_ext.DisplayName] = deal(mdl_ext.modeltps); [mdl_ext.Group] = deal(mdl_ext.lmgroups); end N_extmdl=length(mdl_ext); % Loop over extensions and add the ones which fit the circumstances for n=1:N_extmdl TAKE_MODEL=0; if (mdl_ext(n).minNF==0 && mdl_ext(n).maxNF==0) % use exactNF if any(nf==mdl_ext(n).exactNF) TAKE_MODEL=1; end else if (nf>=mdl_ext(n).minNF && nf<=mdl_ext(n).maxNF) TAKE_MODEL=1; end end if TAKE_MODEL cfunc= mdl_ext(n).fCreate; if iscell(cfunc) % just want a function cfunc= cfunc{1}; end if ischar(cfunc) % make sure we have a function handle cfunc = str2func(cfunc); end ud.fCreate=[ud.fCreate {cfunc}]; ud.DisplayName=[ud.DisplayName {mdl_ext(n).DisplayName}]; ud.Group=[ud.Group {mdl_ext(n).Group}]; end end if DatumType(L) % make list of permisble models for datumtypes SelectedModels= true(size(ud.DisplayName)); for i=1:length(ud.DisplayName); % construct a model mi= ud.fCreate{i}('nfactors',nf); SelectedModels(i)= permitsDatum(mi); end ud.DisplayName= ud.DisplayName(SelectedModels); ud.Group= ud.Group(SelectedModels); ud.fCreate= ud.fCreate(SelectedModels); end