0
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 1 % ELEMENTOP applies the given operator to the input matrices.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 3 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 4 % DESCRIPTION: ELEMENTOP applies the given operator to the input matrices.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 5 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 6 % CALL: a = elementOp(op, opname, opsym, infoObj, pl, fcnArgIn, varNames)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 7 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 8 % PARAMETERS: op - MATLAB operation name
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 9 % opname - Name for displaying
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 10 % opsym - Operation symbol
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 11 % infoObj - minfo object
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 12 % pl - default plist
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 13 % fcnArgIn - Input argument list of the calling fcn.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 14 % varNames - Variable names of the input
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 15 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 16 % VERSION: $Id: elementOp.m,v 1.10 2011/02/11 12:30:29 hewitson Exp $
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 17 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 19
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 20 function varargout = elementOp(varargin)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 21
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 22 import utils.const.*
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 23
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 24 % Settings
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 25 callerIsMethod = varargin{1};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 26 op = varargin{2};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 27 opname = varargin{3};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 28 opsym = varargin{4};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 29
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 30 infoObj = varargin{5};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 31 pl = varargin{6};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 32
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 33 fcnArgIn = varargin{7};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 34 varNames = varargin{8};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 35
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 36 if numel(fcnArgIn) ~=2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 37 error('### The operator %s can only operate on two inputs', op);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 38 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 39
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 40 mat1 = fcnArgIn{1};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 41 mat2 = fcnArgIn{2};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 42
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 43 if isnumeric(mat1) || ischar(mat1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 44 if ischar(mat1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 45 mat1 = eval(mat1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 46 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 47 nums = mat1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 48 varNames{1} = utils.helper.mat2str(nums);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 49 % build a numeric/char object of the same size of mat2
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 50 mat1 = copy(mat2,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 51 for ii=1:numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 52 if numel(nums) == numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 53 expr = nums(ii);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 54 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 55 expr = nums;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 56 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 57 mat1.objs(ii) = feval(class(mat2.objs), expr);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 58 mat1.objs(ii).setName(num2str(expr));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 59 if isprop(mat2.objs(ii), 'xunits') || (isa(mat2.objs(ii), 'ao') && ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 60 isprop(mat2.objs(ii).data, 'xunits'))
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 61 mat1.objs(ii).setXunits(mat2.objs(ii).xunits);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 62 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 63 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 64 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 65 if isnumeric(mat2) || ischar(mat2)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 66 if ischar(mat2)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 67 mat2 = eval(mat2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 68 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 69 nums = mat2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 70 varNames{2} = utils.helper.mat2str(nums);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 71 % build a numeric/char object of the same size of mat1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 72 mat2 = copy(mat1,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 73 for ii=1:numel(mat2.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 74 if numel(nums) == numel(mat2.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 75 expr = nums(ii);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 76 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 77 expr = nums;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 78 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 79 mat2.objs(ii) = feval(class(mat1.objs), expr);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 80 mat2.objs(ii).setName(utils.helper.num2str(expr));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 81 if isprop(mat2.objs(ii), 'xunits') || (isa(mat2.objs(ii), 'ao') && ...
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 82 isprop(mat2.objs(ii).data, 'xunits'))
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 83 mat2.objs(ii).setXunits(mat1.objs(ii).xunits);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 84 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 85 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 86 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 87
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 88 % matrix objects must all contain the same class
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 89 if ~strcmp(class(mat1.objs), class(mat2.objs))
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 90 error('### The %s operator can only apply to matrix objects containing the same class of objects. [%s .* %s]', op, class(mat1.objs), class(mat2.objs));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 91 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 92
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 93
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 94 % init output
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 95 mat = copy(mat1,1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 96
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 97 %%%%%%%%%% If the first or second input is only one object then %%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 98 %%%%%%%%%% resize the input to the size of the other object. %%%%%%%%%%
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 99 if numel(mat1.objs) == 1 && numel(mat1.objs) ~= numel(mat2.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 100 h1 = mat1.hist;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 101 obj1 = mat1.objs;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 102 obj1(1:numel(mat2.objs)) = obj1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 103 obj1 = reshape(obj1, size(mat2.objs));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 104 mat1 = matrix(obj1);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 105 mat1.name = varNames{1};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 106 mat1.hist = h1;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 107 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 108 if numel(mat2.objs) == 1 && numel(mat2.objs) ~= numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 109 h2 = mat2.hist;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 110 obj2 = mat2.objs;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 111 obj2(1:numel(mat1.objs)) = obj2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 112 obj2 = reshape(obj2, size(mat1.objs));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 113 mat2 = matrix(obj2);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 114 mat2.name = varNames{2};
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 115 mat2.hist = h2;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 116 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 117
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 118 if ~all(size(mat1.objs) == size(mat2.objs))
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 119 error('### The Input objects must have the same size. Size of mat1 [%d %d], mat2 [%d %d]', size(mat1.objs,1), size(mat1.objs,2), size(mat2.objs,1), size(mat2.objs,2));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 120 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 121
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 122 % switch between operations
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 123 switch lower(op)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 124 case 'plus'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 125 % plus operation
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 126 for kk = 1:numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 127 mat.objs(kk) = mat1.objs(kk) + mat2.objs(kk);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 128 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 129 case 'minus'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 130 % minus operation
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 131 for kk = 1:numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 132 mat.objs(kk) = mat1.objs(kk) - mat2.objs(kk);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 133 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 134 case 'times'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 135 % times operation
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 136 for kk = 1:numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 137 mat.objs(kk) = mat1.objs(kk) .* mat2.objs(kk);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 138 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 139 case 'rdivide'
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 140 % rdivide operation
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 141 for kk = 1:numel(mat1.objs)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 142 mat.objs(kk) = mat1.objs(kk) ./ mat2.objs(kk);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 143 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 144 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 145
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 146 if ~callerIsMethod
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 147 mat.name = [varNames{1} opsym varNames{2}];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 148 mat.addHistory(infoObj, pl, varNames, [mat1.hist mat2.hist]);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 149 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 150
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 151 varargout{1} = mat;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 152
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 153 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 154