% SPSDSUBTRACTION makes a sPSD-weighted least-square iterative fit%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DESCRIPTION: SPSDSUBTRACTION makes a sPSD-weighted least-square iterative fit%% CALL: [MPest, aoResiduum, plOut, aoP, aoPini] = optSubtraction(mat_Y, mat_U);% [MPest, aoResiduum, plOut, aoP, aoPini] = optSubtraction(mat_Y, mat_U, pl);%% The function finds the optimal M that minimizes the sum of the weighted sPSD of% (mat_Y - M * mat_U)%% OUTPUTS: - MPest: output PEST object with parameter estimates% - aoResiduum: residuum times series % - plOut: plist containing data like the parameter estimates% - aoP: last weight used in the optimization (fater last% Maximization/Expectation step)% - aoPini: initial weight used in the optimization (before first% Maximization/Expectation step) %% <a href="matlab:utils.helper.displayMethodInfo('ao', 'optSubtraction')">Parameters Description</a>%% VERSION : $Id: spsdSubtraction.m,v 1.1 2011/04/17 21:24:20 adrien Exp $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function varargout = spsdSubtraction(varargin) % use the caller is method flag callerIsMethod = utils.helper.callerIsMethod; % Check if this is a call for parameters if utils.helper.isinfocall(varargin{:}) varargout{1} = getInfo(varargin{3}); return end % Collect input variable names in_names = cell(size(varargin)); for ii = 1:nargin,in_names{ii} = inputname(ii);end if ~nargin>1 error('optSubtraction requires at two input matrix objects (less than two input arguments were provided!)') end %% retrieving the two input aos [mat_in, mat_invars] = utils.helper.collect_objects(varargin(:), 'matrix', in_names); if numel(mat_in)~=2 error('first two inputs should be two matrices of aos involved in the subtraction') end % Collect plist pl = utils.helper.collect_objects(varargin(:), 'plist'); % Get default parameters pl = combine(pl, getDefaultPlist); %% getting ao arrays ao_Y = mat_in(1).objs; ao_U = mat_in(2).objs; %% running the ao method if nargout>2 [MPest, plOut, aoResiduum, aoP, aoPini] = optSubtraction(ao_Y, ao_U, pl); matResiduum = matrix(aoResiduum); matP = matrix(aoP); matPini = matrix(aoPini); else [MPest, plOut] = optSubtraction(ao_Y, ao_U, pl); end %% collecting history if callerIsMethod % we don't need the history of the input else inhist = mat_in(:).hist; end %% adding history if callerIsMethod % we don't to set the history else MPest.addHistory(getInfo('None'), pl, mat_invars, inhist); if nargout>2 matP.addHistory(getInfo('None'), pl, mat_invars, inhist); matPini.addHistory(getInfo('None'), pl, mat_invars, inhist); matResiduum.addHistory(getInfo('None'), pl, mat_invars, inhist); end end %% return coefficients and hessian and Jfinal and powAvgWeight varargout = {MPest, plOut, aoP, aoPini};end%--------------------------------------------------------------------------% Get Info Object%--------------------------------------------------------------------------function ii = getInfo(varargin) if nargin == 1 && strcmpi(varargin{1}, 'None') sets = {}; pl = []; else sets = {'Default'}; pl = getDefaultPlist; end % Build info object ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.op, '$Id: spsdSubtraction.m,v 1.1 2011/04/17 21:24:20 adrien Exp $', sets, pl);end%--------------------------------------------------------------------------% Get Default Plist%--------------------------------------------------------------------------function plout = getDefaultPlist() persistent pl; if exist('pl', 'var')==0 || isempty(pl) pl = buildplist(); end plout = pl;endfunction pl = buildplist() pl = ssm.getInfo('ao/spsdSubtraction', 'Default').plists;end