Mercurial > hg > ltpda
diff m-toolbox/classes/@matrix/spsdSubtraction.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@matrix/spsdSubtraction.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,127 @@ +% 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; +end + +function pl = buildplist() + pl = ssm.getInfo('ao/spsdSubtraction', 'Default').plists; +end + +