Mercurial > hg > ltpda
diff m-toolbox/classes/@matrix/matrix.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children | a71a40911c27 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@matrix/matrix.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,455 @@ +% MATRIX constructor for matrix class. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: MATRIX constructor for matrix class. +% +% CONSTRUCTOR: +% +% fb = matrix() - creates an empty matrix object +% fb = matrix(objs) - construct from an array of objects +% fb = matrix(pl) - create a matrix object from a parameter list +% +% <a href="matlab:utils.helper.displayMethodInfo('matrix', 'matrix')">Parameters Description</a> +% +% VERSION: $Id: matrix.m,v 1.49 2011/08/23 13:50:46 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +classdef matrix < ltpda_uoh + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Property definition % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %---------- Public (read/write) Properties ---------- + properties + objs = []; % objects in matrix + end + + %---------- Protected read-only Properties ---------- + properties (SetAccess = protected) + end + + %---------- Private Properties ---------- + properties (GetAccess = protected, SetAccess = protected) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Check property setting % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods + + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Constructor % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods + function obj = matrix(varargin) + + callerIsMethod = utils.helper.callerIsMethod; + + import utils.const.* + utils.helper.msg(msg.OMNAME, 'running %s/%s', mfilename('class'), mfilename); + + % Collect all matrix objects + [mats, invars, rest] = utils.helper.collect_objects(varargin(:), 'matrix'); + + if isempty(rest) && ~isempty(mats) + % Do copy constructor and return + utils.helper.msg(msg.OPROC1, 'copy constructor'); + obj = copy(mats, 1); + for kk=1:numel(obj) + obj(kk).addHistory(matrix.getInfo('matrix', 'None'), [], [], obj(kk).hist); + end + return + end + + switch nargin + case 0 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%% no input %%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'empty constructor'); + obj.addHistory(matrix.getInfo('matrix', 'None'), plist(), [], []); + + case 1 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%% one input %%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if ischar(varargin{1}) + %%%%%%%%%% pzm = matrix('foo.mat') %%%%%%%%%% + %%%%%%%%%% pzm = matrix('foo.xml') %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'constructing from file %s', varargin{1}); + obj = fromFile(obj, varargin{1}); + + elseif isstruct(varargin{1}) + %%%%%%%%%% r = matrix(struct) %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'constructing from struct'); + obj = fromStruct(obj, varargin{1}); + + elseif isa(varargin{1}, 'ltpda_uoh') + %%%%%%%%%% r = matrix(<ltpda_uoh-objects>) %%%%%%%%%% + obj = obj.fromInput(plist('objs', varargin), callerIsMethod); + + elseif isnumeric(varargin{1}) + %%%%%%%%%% r = matrix(doubleArray) %%%%%%%%%% + obj = obj.fromValues(plist('values', varargin{1}), callerIsMethod); + + elseif isa(varargin{1}, 'plist') + %%%%%%%%%% r = matrix(plist) %%%%%%%%%% + pl = varargin{1}; + + if pl.isparam('filename') + utils.helper.msg(msg.PROC2, 'constructing from file %s', pl.find('filename')); + obj = obj.fromFile(pl); + + elseif pl.isparam('hostname') || pl.isparam('conn') + utils.helper.msg(msg.PROC2, 'constructing from repository %s', pl.find('hostname')); + obj = obj.fromRepository(pl); + + elseif pl.isparam('objs') + obj = obj.fromInput(pl, callerIsMethod); + + elseif pl.isparam('plist') + obj = matrix(pl.find('plist')); + + elseif pl.isparam('built-in') + utils.helper.msg(msg.OPROC1, 'constructing from built-in model'); + obj = fromModel(obj, pl); + + elseif pl.isparam('csd') + utils.helper.msg(msg.PROC2, 'constructing from csd %s', char(pl.find('csd'))); + obj = obj.fromCSD(pl); + + elseif pl.isparam('model') + utils.helper.msg(msg.PROC2, 'constructing Multichannel Zero Mean Gaussian Noise %s', char(pl.find('model'))); + obj = obj.MultiChannelNoise(pl); + + elseif pl.isparam('values') + obj = obj.fromValues(pl, callerIsMethod); + + else + obj.setProperties(pl); + obj.addHistory(matrix.getInfo('matrix', 'None'), pl, [], []); + end + + else + error('### Unknown single argument constructor.'); + end + + case 2 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%% two inputs %%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if isa(varargin{1}, 'ltpda_uoh') && isa(varargin{2}, 'ltpda_uoh') + %%%%%%%%%% f = matrix(a1, a2) %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'retrieve from repository'); + obj = obj.fromInput(plist('objs', varargin), callerIsMethod); + + elseif (isa(varargin{1}, 'database') || isa(varargin{1}, 'mpipeline.repository.RepositoryConnection')) ... + && isnumeric(varargin{2}) + %%%%%%%%%% f = matrix(<database-object>, [IDs]) %%%%%%%%%% + utils.helper.msg(msg.OPROC1, 'retrieve from repository'); + obj = obj.fromRepository(plist('conn', varargin{1}, 'id', varargin{2})); + + elseif isa(varargin{1}, 'matrix') && isa(varargin{2}, 'plist') && isempty(varargin{2}.params) + %%%%%%%%%% f = matrix(matrix-object, <empty plist>) %%%%%%%%%% + obj = matrix(varargin{1}); + + elseif isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ... + isa(varargin{2}, 'history') + %%%%%%%%%% obj = matrix(DOM node, history-objects) %%%%%%%%%% + obj = fromDom(obj, varargin{1}, varargin{2}); + + elseif isnumeric(varargin{1}) && iscell(varargin{2}) + %%%%%%%%%% r = matrix(doubleArray, cellArray) %%%%%%%%%% + obj = matrix(plist('values', varargin{1}, 'yunits', varargin{2})); + + elseif isa(varargin{1}, 'ltpda_uoh') && isa(varargin{2}, 'plist') + %%%%%%%%%%% matrix(<ltpda_uoh>-object, plist-object) %%%%%%%%%% + % always recreate from plist if it contains 'objs' key + + + % If we are trying to load from file, and the file exists, do + % that. Otherwise, copy the input object. + if varargin{2}.isparam('filename') + if exist(fullfile('.', find(varargin{2}, 'filename')), 'file')==2 + obj = matrix(varargin{2}); + else + obj = matrix(varargin{1}); + end + else + if isparam(varargin{2}, 'objs') + obj = matrix(varargin{2}); + else + obj = obj.fromInput(combine(plist('objs', varargin{1}), varargin{2}), callerIsMethod); + end + end + else + error('### Unknown 2 argument constructor.'); + end + + otherwise + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%% any input %%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + [pls, mat_invars, rest] = utils.helper.collect_objects(varargin, 'plist'); + pl = combine(plist('objs', rest), pls); + + obj = obj.fromInput(pl, callerIsMethod); + end + + end % End constructor + + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Static) + + function mdls = getBuiltInModels(varargin) + mdls = ltpda_uo.getBuiltInModels('matrix'); + end + + function out = VEROUT() + out = '$Id: matrix.m,v 1.49 2011/08/23 13:50:46 hewitson Exp $'; + end + + function ii = getInfo(varargin) + ii = utils.helper.generic_getInfo(varargin{:}, 'matrix'); + end + + function out = SETS() + out = [SETS@ltpda_uoh, ... + {'From Input'}, ... + {'MultiChannel Noise'}, ... + {'From CSD'}, ... + {'From Values'}]; + end + + function plout = getDefaultPlist(set) + persistent pl; + persistent lastset; + if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set) + pl = matrix.buildplist(set); + lastset = set; + end + plout = pl; + end + + function out = buildplist(set) + + if ~utils.helper.ismember(lower(matrix.SETS), lower(set)) + error('### Unknown set [%s]', set); + end + + out = plist(); + out = matrix.addGlobalKeys(out); + out = buildplist@ltpda_uoh(out, set); + + switch lower(set) + case 'default' + p = param({'shape', 'Specify the shape of the resulting matrix.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + p = param({'objs', 'Matrix of user objects.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + case 'from input' + p = param({'shape', 'Specify the shape of the resulting matrix.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + p = param({'objs', 'Matrix of user objects.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + case 'from csd' + + % CSD + p = param({'csd','A matrix of fsdata AOs containing the cross spectral density matrix elements.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + % Target Objects + p = param({'targetobj', ['Choose the type of output objects:<ul>',... + '<li>''miir'' output a matrix containing filterbanks of parallel miir filters</li>',... + '<li>''parfrac'' output a matrix containing parafracs objects</li>']}, ... + {1, {'miir','parfrac'}, paramValue.OPTIONAL}); + out.append(p); + + % Fs + p = param({'fs', 'The sampling frequency of the discrete filters.'}, {1, {1}, paramValue.OPTIONAL}); + out.append(p); + + % Max Iter + p = param({'MaxIter', 'Maximum number of fit iterations.'}, {1, {50}, paramValue.OPTIONAL}); + out.append(p); + + % Pole type + p = param({'PoleType',['Choose the pole type for fitting initialization:<ul>',... + '<li>1 == use real starting poles</li>',... + '<li>2 == generates complex conjugate poles of the type <tt>a.*exp(theta*pi*j)</tt> with <tt>theta = linspace(0,pi,N/2+1)</tt></li>',... + '<li>3 == generates complex conjugate poles of the type <tt>a.*exp(theta*pi*j)</tt> with <tt>theta = linspace(0,pi,N/2+2)</tt></li></ul>']}, ... + {1, {1, 2, 3}, paramValue.SINGLE}); + out.append(p); + + % Min order + p = param({'MinOrder','Minimum order to fit with.'}, {1, {7}, paramValue.OPTIONAL}); + out.append(p); + + % Max Order + p = param({'MaxOrder','Maximum order to fit with.'}, {1, {35}, paramValue.OPTIONAL}); + out.append(p); + + % Weights + p = param({'Weights',['Choose weighting for the fit:<ul>',... + '<li> 1 == equal weights for each point</li>',... + '<li> 2 == weight with <tt>1/abs(model)</tt></li>',... + '<li> 3 == weight with <tt>1/abs(model).^2</tt></li>',... + '<li> 4 == weight with inverse of the square mean spread of the model</li></ul>']}, {2, {1 2 3 4}, paramValue.SINGLE}); + out.append(p); + + % Plot + p = param({'Plot', 'Plot results of each fitting step.'}, paramValue.TRUE_FALSE); + p.val.setValIndex(2); + out.append(p); + + % MSE Vartol + p = param({'MSEVARTOL', ['Mean Squared Error Variation - Check if the realtive variation of the mean squared error is<br>',... + 'smaller than the value specified. This option is useful for finding the minimum of Chi squared.']}, ... + {1, {1e-2}, paramValue.OPTIONAL}); + out.append(p); + + % FIT TOL + p = param({'FITTOL',['Mean Squared Error Value - Check if the mean squared error value <br>',... + ' is lower than the value specified.']}, {1, {1e-2}, paramValue.OPTIONAL}); + out.append(p); + + % UseSym + p = param({'UseSym', ['Use symbolic calculation in eigen-decomposition.<ul>'... + '<li>''on'' - uses symbolic math toolbox calculation<br>'... + 'for poles stabilization</li>'... + '<li>''off'' - perform double-precision calculation<br>'... + 'for poles stabilization</li>']}, {1, {'on','off'}, paramValue.SINGLE}); + out.append(p); + + % Iunits + p = param({'iunits', 'The unit to set as input unit for the output filters'}, paramValue.EMPTY_STRING); + out.append(p); + + % Ounits + p = param({'ounits', 'The unit to set as output unit for the output filters'}, paramValue.EMPTY_STRING); + out.append(p); + + case 'multichannel noise' + + % Model + p = param({'model','A matrix of filterbanks or parfarcs objects, modeling multichannel system response.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + % Nsecs + p = param({'nsecs', 'Number of seconds in the desired noise data series.'}, {1, {1}, paramValue.OPTIONAL}); + out.append(p); + + % Fs + p = param({'fs', 'The sampling frequency of the noise data series.'}, {1, {1}, paramValue.OPTIONAL}); + out.append(p); + + % Yunits + p = param({'yunits','Unit on Y axis.'}, paramValue.STRING_VALUE('m')); + out.append(p); + + case 'from values' + + % Values + p = param({'values', 'Each value will create a single AO.'}, paramValue.EMPTY_DOUBLE); + out.append(p); + + % Yunits + p = param({'yunits', 'Y-unit for the AOs which are built from the values'}, paramValue.EMPTY_CELL); + out.append(p); + + % Names + p = param({'names', 'Names for the AOs which are built from the values'}, paramValue.EMPTY_CELL); + out.append(p); + + end + end % function out = getDefaultPlist(varargin) + + function obj = initObjectWithSize(n,m) + obj = matrix.newarray([n m]); + end + + end % End static methods + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static, private) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods (Static, Access=private) + varargout = elementOp(varargin) + end % End static, private methods + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (static, hidden) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + methods (Static = true, Hidden = true) + varargout = loadobj(varargin) + varargout = update_struct(varargin); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (public) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods + + varargout = char(varargin) + varargout = display(varargin) + varargout = copy(varargin) + out = det(varargin) + out = inv(varargin) + varargout = minus(varargin) + varargout = plus(varargin) + varargout = rdivide(varargin) + varargout = times(varargin) + varargout = mtimes(varargin) + varargout = transpose(varargin) + varargout = ctranspose(varargin) + varargout = filter(varargin) + varargout = conj(varargin) + varargout = nrows(varargin) + varargout = ncols(varargin) + varargout = osize(varargin) + varargout = setObjs(varargin) + varargout = getObjectAtIndex(varargin) + end + + methods (Hidden = true) + varargout = attachToDom(varargin) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (protected) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Access = protected) + varargout = fromInput(varargin) + varargout = fromStruct(varargin) + varargout = fromDom(varargin) + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Methods (private) % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + methods (Access = private) + % Constructors + varargout = wrapper(varargin) + a = fromCSD(a, pli) + a = MultiChannelNoise(a, pli) + end + +end % End classdef +