From 7014c89a6c156977493e739a3b5b92634b23056f Mon Sep 17 00:00:00 2001
From: Ferdinand Fischer <ferdinand.fischer@fau.de>
Date: Thu, 23 May 2019 20:54:46 +0200
Subject: [PATCH] Make the changeGrid function behave like a call-by-value
 function

---
 +quantity/Discrete.m | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/+quantity/Discrete.m b/+quantity/Discrete.m
index 9e12a59..4211c16 100644
--- a/+quantity/Discrete.m
+++ b/+quantity/Discrete.m
@@ -282,8 +282,10 @@ classdef  (InferiorClasses = {?quantity.Symbolic, ?quantity.Operator}) Discrete
 			% that quantity has same grid and gridName as quantity a
 			% as well.
 			if isempty(a)
-				referenceGridName = '';
-				referenceGrid = {};
+				if nargin > 1
+					varargin{1}.assertSameGrid(varargin{2:end});
+				end				
+				return;
 			else
 				referenceGridName = a(1).gridName;
 				referenceGrid= a(1).grid;
@@ -315,9 +317,13 @@ classdef  (InferiorClasses = {?quantity.Symbolic, ?quantity.Operator}) Discrete
 			% gridSize for each iteratively.
 			
 			if isempty(a)
-				referenceGridName = '';
-				referenceGrid = {};
-				referenceGridSize = [];
+				if nargin > 1
+					[referenceGrid, referenceGridName] = varargin{1}.getFinestGrid(varargin{2:end});
+				else
+					referenceGrid = {};
+					referenceGridName = '';
+				end
+				return;
 			else
 				referenceGridName = a(1).gridName;
 				referenceGrid = a(1).grid;
@@ -483,9 +489,13 @@ classdef  (InferiorClasses = {?quantity.Symbolic, ?quantity.Operator}) Discrete
 						value = objCell{k};
 						for l = 1:numel(value)
 							M(:,l) = repmat(value(l), prod(obj(1).gridSize), 1);
+						end
+						if isempty(value)
+							M = zeros([prod(obj(1).gridSize), size(value(l))]);
 						end
 							M = reshape(M, [obj(1).gridSize, size(value)]);
 						o = quantity.Discrete( M, ...
+							'size', size(value), ...
 							'gridName', obj(1).gridName, ...
 							'grid', obj(1).grid);
 					end
@@ -952,7 +962,7 @@ classdef  (InferiorClasses = {?quantity.Symbolic, ?quantity.Operator}) Discrete
 			s = struct(obj);
 		end
 		
-		function obj = changeGrid(obj, gridNew, gridNameNew)
+		function newObj = changeGrid(obj, gridNew, gridNameNew)
 			% change the grid of the obj quantity. The order of grid and
 			% gridName in the obj properties remains unchanged, only the
 			% data points are exchanged.
@@ -968,11 +978,12 @@ classdef  (InferiorClasses = {?quantity.Symbolic, ?quantity.Operator}) Discrete
 			end
 			assert(isequal(myGridName(:), obj(1).gridName(:)), 'rearranging grids failed');
 			
+			newObj = obj.copy();
 			for it = 1 : numel(obj)
-				obj(it).valueDiscrete = obj(it).on(myGrid);
+				newObj(it).valueDiscrete = obj(it).on(myGrid);
 			end
-			[obj.derivatives] = deal({});
-			[obj.grid] = deal(myGrid);
+			[newObj.derivatives] = deal({});
+			[newObj.grid] = deal(myGrid);
 		end
 		
 	end
-- 
GitLab