www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@contwostage/fit.m

    function [con,ok,sp,bp,sfopts] = fit(con,action,opts,Xdata,sp,bp)
%FIT fit con object
%
% [con,ok,sp,bp,status,params] = fit(con,action,opts,X,sp,bp)
%  Inputs
%    con:      con object
%    action:   'All', 'SpecialPoints', 'BoundaryPoints', or% 'Constraint'
%    opts:     fitoptions optimmgr
%    X:        data to be fitted
%    sp:       special points
%    bp:       boundary points
%
% Outputs:
%    con
%    ok:      fit status flag
%    sp       special points
%    bp       boundary points
%    status:  status structure
%    params:  local parameters matrix


%  Copyright 2008 The MathWorks, Inc. and Ford Global Technologies, Inc.

doSpecialPoints  = false;
doBoundaryPoints = false;
doFitConstraint  = false;

sopts = [];
bpopts = [];
fopts = [];
localConstraintFitOptions =[];
globalModelFitOptions = [];

switch lower(action)
    case 'all'
        sopts = get(opts,'SpecialPointOptions');
        bpopts = get(opts,'BoundaryPointOptions');
        fopts = get(opts,'ConstraintFitOptions');
        localConstraintFitOptions = get( fopts, 'LocalConstraintOptions' );
        globalModelFitOptions     = get( fopts, 'GlobalModelOptions' );

        
        doSpecialPoints  = true;
        doBoundaryPoints = true;
        doFitConstraint  = true;

    case 'specialpoints'
        sopts = opts;
        doSpecialPoints = true;
    case 'boundarypoints'
        bpopts = opts;
        doBoundaryPoints = true;
    case 'constraint'
        fopts =opts;
        localConstraintFitOptions = get( fopts, 'LocalConstraintOptions' );
        globalModelFitOptions     = get( fopts, 'GlobalModelOptions' );
       
        doFitConstraint = true;
    otherwise
        error(message('mbc:xregbdrydev:InvalidArgument'));
end

haveSpecialPointOptions  = ~isempty(sopts );
haveBoundaryPointOptions = ~isempty( bpopts );
haveConstraintFitOptions = ~isempty( localConstraintFitOptions) || ~isempty(globalModelFitOptions);

doSpecialPoints  = doSpecialPoints  && haveSpecialPointOptions;
doBoundaryPoints = doBoundaryPoints && haveBoundaryPointOptions;


conLocal = getlocal( con );

doFitLocalConstraint = doFitConstraint && ~isempty( localConstraintFitOptions );
doFitGlobalModel     = doFitConstraint && ~isempty( globalModelFitOptions );


% Get data for fitting constraint to
Xg = Xdata{1}; % Global Data
Xl = Xdata{2}; % Local Data
nSweeps = size( Xl, 3 );

% Allocate space ahead of fitting
ok = true( nSweeps, 1 );

if ~iscell( sp ) || any( size( sp ) ~= [nSweeps, 1] ),
    sp = cell( nSweeps, 1 );
end

if ~iscell( bp ) || any( size( bp ) ~= [nSweeps, 1] ),
    bp = cell( nSweeps, 1 );
end

parameters = zeros( nSweeps, nFeatures( conLocal ) );


% Fit local constraints
if doSpecialPoints || doBoundaryPoints || doFitLocalConstraint,
    for i = 1:nSweeps,
        if ok(i) && doSpecialPoints,
            [conLocal, sp{i}, ok(i)] = findSpecialPoints( conLocal, sopts, Xl{i} );
        end

        if ok(i) && doBoundaryPoints,
            [conLocal, bp{i}, ok(i)] = findBoundaryPoints( conLocal, bpopts, Xl{i} );
        end

        if ok(i) && doFitLocalConstraint,
            x = Xl{i};
            x = x(bp{i},:);
            [conLocal, ok(i)] = fitConstraint( conLocal, localConstraintFitOptions, x );
        end

        if ok(i),
            parameters(i,:) = getFeatures( conLocal );
        else
            parameters(i,:) = NaN;
        end
    end
end

% Fit global models
if any( ok ) && doFitGlobalModel,
    % We were able to fit at least some local constraints. We now fit the
    % global model to data provided by those constraint that we were able
    % to fit.
    [con, ok] = fitglobal( con, Xg(ok,:), parameters(ok,:) ); % TO DO: globalModelFitOptions ?
else
    ok = any( ok );
end

sfopts.doSpecialPoints = doSpecialPoints;
sfopts.doBoundaryPoints = doBoundaryPoints;
sfopts.doFitConstraint = doFitConstraint;
sfopts.LocalParameters = parameters;