Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/intersect.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/@ao/intersect.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,233 @@ +% INTERSECT overloads the intersect operator for Analysis objects. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: INTERSECT overloads the intersect operator for Analysis +% objects. +% +% CALL: out = intersect(a1, a2); +% +% EXAMPLE: This example shows only the x-values: +% +% a1: |-----------| |--------------------| +% a2: |-------------------------------------| +% +% The output have the x-values of a1 and the y-values of a2 +% +% <a href="matlab:utils.helper.displayMethodInfo('ao', 'intersect')">Parameters Description</a> +% +% VERSION: $Id: intersect.m,v 1.5 2011/04/08 08:56:12 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = intersect (varargin) + + % 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 + + % Collect all AOs + [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names); + pl = utils.helper.collect_objects(varargin(:), 'plist'); + + % Check input arguments number + if length(as) < 2 + error ('### Incorrect inputs. This method needs at least two input AOs.'); + end + + if nargout == 0 + error('### Intersect cannot be used as a modifier. Please give an output variable.'); + end + + % Decide on a deep copy or a modify + bs = copy(as, nargout); + + % Combine input PLIST with default PLIST + pl = combine(pl, getDefaultPlist()); + + % get options + axis = pl.find('axis'); + tol = pl.find('tol'); + + % Get data object + out = []; + mask = bs(1); + + for ii = 2:numel(bs) + a = bs(ii); + + % Choos always the data type of the second input + dout = a.data.initObjectWithSize(1,1); + + % Calculate and set values + if isa(dout, 'cdata') + if any(find(axis == 'y')) + [y, idx] = localIntersect(mask.data.getY, a.data.getY, tol); + dout.setY(y); + setDataValues(dout, a, idx); + else + x1 = localGetAbsoluteX(mask); + x2 = localGetAbsoluteX(a); + [y, idx] = localIntersect(x1, x2, tol); + dout.setY(y); + setDataValues(dout, a, idx); + end + else + if strcmpi(axis, 'y') + [y, idx] = localIntersect(mask.data.getY, a.data.getY, tol); + x = localGetAbsoluteX(a); + dout.setX(x(idx)); + dout.setY(y); + setDataValues(dout, a, idx); + elseif strcmpi(axis, 'x') + x1 = localGetAbsoluteX(mask); + x2 = localGetAbsoluteX(a); + + [x, idx] = localIntersect(x1, x2, tol); + dout.setX(x); + dout.setY(a.y(idx)); + setDataValues(dout, a, idx); + else + error('### This axis is not allowed [%s]. Please use one of the following inputs ''x'' or ''y'''); + end + end + + % collapse dout if possible + if isa(dout, 'tsdata') + dout.collapseX(); + end + + % Set name + a.name = sprintf('%s(%s, %s)', mfilename, ao_invars{1}, ao_invars{ii}); + % Set data object + a.data = dout; + % Set history + a.addHistory(getInfo('None'), pl, ao_invars([1 ii]), [mask.hist a.hist]); + + out = [out a]; + end + + % Set output + if nargout == 1 + varargout{1} = out; + end +end + +%-------------------------------------------------------------------------- +% Set all necessary values to the data object +%-------------------------------------------------------------------------- +function setDataValues(dout, a, idx) + + setErrors(dout, a, idx); + setUnits(dout, a); + + % Set special values for the fsdata + if isa(dout, 'fsdata') + dout.setNavs(a.data.navs); + dout.setEnbw(a.data.enbw); + dout.setT0(a.data.t0); + dout.setFs(a.data.fs); + end +end + +%-------------------------------------------------------------------------- +% Set the units for the intersection +%-------------------------------------------------------------------------- +function setUnits(dout, a) + dout.setYunits(a.yunits); + if ~isa(dout, 'cdata') + dout.setXunits(a.xunits); + end +end + +%-------------------------------------------------------------------------- +% Set the error(s) for the intersection +%-------------------------------------------------------------------------- +function setErrors(dout, a, idx) + % Calculate dy + if ~isempty(a.dy) + if numel(a.dy) == 1 + dout.setDy(a.dy); + else + dout.setDy(a.dy(idx)); + end + end + + % Calculate dx + if ~isa(dout, 'cdata') && ~isempty(a.dx) + if numel(a.dx) == 1 + dout.setDx(a.dx); + else + dout.setDx(a.dx(idx)); + end + end +end + +%-------------------------------------------------------------------------- +% Calculates the intersection of a and b with a tolerance +%-------------------------------------------------------------------------- +function x = localGetAbsoluteX(a) + if isa(a.data, 'tsdata') + x = a.data.getX + a.data.t0.utc_epoch_milli/1e3; + else + x = a.data.getX; + end +end + +%-------------------------------------------------------------------------- +% Calculates the intersection of a and b with a tolerance +%-------------------------------------------------------------------------- +function [out, idxB] = localIntersect(a,b,tol) + if isempty(tol) + [out, idxA, idxB] = intersect(a, b); + else + error('### Please code me up.'); + end +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.trig, '$Id: intersect.m,v 1.5 2011/04/08 08:56:12 hewitson Exp $', sets, pl); + ii.setModifier(false); + ii.setArgsmin(2); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist() + persistent pl; + if exist('pl', 'var')==0 || isempty(pl) + pl = buildplist(); + end + plout = pl; +end + +function out = buildplist() + out = plist(); + + % AXIS + p = param({'axis', 'The axis on which to apply the method.'}, {1, {'x', 'y'}, paramValue.SINGLE}); + out.append(p); + + % TOL + p = param({'tol', 'Tolerance for the intersect method.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + +end +