www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/@mdev_local/fitmodel.m

    function [OK,mdev]= fitmodel(mdev,varargin)
%FITMODEL Fit tests
%
%  [OK,B] = fitmodel(mdev,SweepNos,ProcessResults)
%    mdev            mdev_local object (normally called via pointer as p.FitModel
%    SweepNos        optional argument to specify sweeps to update
%    ProcessResults  boolean to specify whether to update stats and rfs

%  Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.


if mdev.IsLinearised
    [mdev,OK] = FitLinearisedTwoStage( mdev, varargin{:} );
else
    [OK,mdev]= FitGTSLocal(mdev,varargin{:});
end



function [OK,mdev]= FitGTSLocal(mdev,SweepNos,~)

% Get Data
[Xfit,Y]= getdata(mdev,'fit');
X = Xfit{1};
Xglobal = Xfit{2};
if nargin<2
    SweepNos=':';
end


Ns= size(X,3);

L= model(mdev);
if ~isGTS(L) && ~isPointByPoint(mdev)
    % fit all tests for average fit model (+linearised in future?)
    % would prefer a method to tell me this
    SweepNos=':';
end


Nl=size(L,1);

B= mdev.AllModels;
Wc= mdev.GLSWeights;
if isempty(B)
    B= NaN(Nl,Ns);
    mdev.FitOK= false(1,Nl);
elseif size(B,2)<Ns
    Nl=size(B,1);
    B= [B NaN*zeros(Nl,Ns-size(B,2))];
    mdev.FitOK= [mdev.FitOK(:)' false(1,Nl)];
elseif size(B,2)>Ns
    B= B(:,1:Ns);
    mdev.FitOK= mdev.FitOK(1:Ns);
end
mdev.AllModels= B;


if isempty(Wc)
    Wc= cell(1,Ns);
elseif length(Wc)<Ns
    Wc= [Wc cell(1,Ns-length(Wc))];
elseif length(Wc)>Ns
    Wc= Wc(1:Ns);
end
mdev.GLSWeights= Wc;

L= model(mdev);
DatumMode= get(L,'DatumType');
if isPointByPoint(mdev) 
    % remove duplicate sweeps for localmulti
    [~,KeepLast] = uniqueFilters(Xglobal);
    Y(:,:,~KeepLast) = NaN;
end

if ~strcmp(SweepNos,':')
    % select sweeps for fitting
    X= X(:,:,SweepNos);
    Y= Y(:,:,SweepNos);
    if ~isempty(B)
        B= B(:,SweepNos);
    end
    if ~isempty(Wc)
        Wc= Wc(SweepNos);
    end
end

% turn warning off as flops gives 10^6 warnings in Optim Tbx
ws = warning('off','all');
if DatumMode==3
    % link to other Datum
    pdatum= datumlink(mdev);
    DATUM= double(pdatum.getdata('Y',0));
    if nargin > 1 && ~strcmp(SweepNos,':')
        DATUM= DATUM(SweepNos,:);
    end
    X= X-DATUM;
end



try
    [L,Bhat,Wchat,OK]= fitmodel(L,X,Y,B,Wc);
    % convert OK into true/false for inserting into FitOK field
    newFitOK = (OK>0);
    warning(ws);
catch ME
    % make sure node is left in a good state if an error occurred during
    % fit
    warning(ws);
    warning(message('mbc:mdev_local:FitError', fullname( mdev ), ME.getReport));
    % set models for all tests to not fitted.
    NsData = size(X,3);
    Bhat = NaN(Nl,NsData);
    Wchat = cell(1,NsData);
    newFitOK = false(1,NsData);
    OK = newFitOK;
end

if ~strcmp(SweepNos,':')
    % Only processing a limited number of sweeps
    Nb=size(mdev.AllModels,1);
    % this augmentation is required for localmulti models
    if size(Bhat,1)<Nb
        % pad new parameters with zeros
        Bhat= [Bhat ; zeros(Nb-size(Bhat,1),size(Bhat,2)) ];
    elseif size(Bhat,1)>Nb
        % pad all parameters with zeros
        mdev.AllModels= [mdev.AllModels ; zeros(size(Bhat,1)-Nb,size(mdev.AllModels,2)) ];
    end
    mdev.AllModels(:,SweepNos)= Bhat;
    if ~isempty(Wchat)
        mdev.GLSWeights(SweepNos)= Wchat;
    end
    mdev.FitOK(SweepNos)= newFitOK;
    % update response feature info etc.
    mdev = Change_RespFeat(mdev,SweepNos);
else
    % update model (incl covmodel)
    % only do this if all sweeps are processed
    mdev= model(mdev,L);

    % update model fit
    mdev.AllModels= Bhat;
    mdev.GLSWeights= Wchat;
    mdev.FitOK= newFitOK;
    % update response feature info etc.
    mdev = Change_RespFeat(mdev);
end
if BMIndex(mdev)~=0
    mdev= BestModel(mdev,0);
end
mdev = status(mdev,0);

% Update heap copy of object
pointer(mdev);