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);