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