www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@localmulti/update.m
function L= update(L,p,dat,fast) %UPDATE update model parameters for local multiple model % % L= update(L,p,dat) % p= [index2model; numParams; params; Range] % Copyright 2000-2016 The MathWorks, Inc. and Ford Global Technologies, Inc. if nargin<4 fast = false; end if ~isfinite(p(1)) % invalid parameters m= get(L.xregmulti,'currentmodel'); b= allparameters(m); p= [get(L.xregmulti,'currentindex'); length(b); b]; end L.xregmulti= set(L.xregmulti,'currentindex',p(1)); if length(p)>1 nf= nfactors(L); nmdls= get(L.xregmulti,'nmodels'); numExtraParams= 2*nf+3+ nmdls; L.SelectionStatistic= NaN(1,nmdls); if ~isfinite(p(2)) % new parameters ExtraParams = p(3:numExtraParams+2); [L,Rng] = setExtraParameters(L,ExtraParams); L = updateAllInternalModels(L,p(numExtraParams+3:end),Rng); L = set(L,'allfitted',true); else % old parameters m = get(L.xregmulti,'currentmodel'); numParams= p(2); mparams= p(3:numParams+2); if length(p)>=numParams+2+numExtraParams % Range stored in parameters ExtraParams= p( (numParams+3): (numParams+2+numExtraParams)); [L,Rng] = setExtraParameters(L,ExtraParams); else Rng = getcode(L); end m = updateCurrentModel(m,Rng,mparams); L.xregmulti= set(L.xregmulti,'internalcurrent',m); % old version L = set(L,'allfitted',false); L.xregmulti= set(L.xregmulti,'weights',~isnan(L.SelectionStatistic')); end end function [L,st] = updateAllInternalModels(L,p,Rng) mdls = get(L.xregmulti,'models'); st = 1; % use weights to indicate whether model is fitted wts = ones(size(mdls)); for i=1:length(mdls) numParams= p(st); if isnan(numParams) % model not fitted st = st+1; wts(i) = 0; else mparams= p(st+1:st+numParams); mdls{i} = updateCurrentModel(mdls{i},Rng,mparams); st = st+numParams+1; wts(i) = 1; end end L.xregmulti= set(L.xregmulti,'internalmodels',mdls); L.xregmulti= set(L.xregmulti,'weights',wts); function [L,Rng] = setExtraParameters(L,ExtraParams) nf= nfactors(L); Rng= reshape(ExtraParams(1:2*nf),nf,2); if ~all(Rng(:)==0) % otherwise we have padded zeros % update ranges for internal and external model L = setBaseRange(L,Rng); % don't do any thing with box-cox for now % bc= ExtraParams( 2*nf+1:2*nf+3); % Selection L.SelectionStatistic= ExtraParams(2*nf+4:end); end function m = updateCurrentModel(m,Rng,mparams) m = setcode(m,Rng); m= updateallparameters( m,mparams);