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