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
+