From 0096611b0624a612645fd77a07e451385cc53522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Sat, 17 May 2014 16:34:08 +0200 Subject: [PATCH] Added the possibility to use parameters in a from-to-do statement. --- matlab/utilities/dseries/from.m | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/matlab/utilities/dseries/from.m b/matlab/utilities/dseries/from.m index b905642d9..5d1a17b4e 100644 --- a/matlab/utilities/dseries/from.m +++ b/matlab/utilities/dseries/from.m @@ -64,6 +64,9 @@ EXPRESSION = char([varargin{5:end}]); % Get all the variables involved in the recursive expression. variables = unique(regexpi(EXPRESSION, '\w*\(t\)|\w*\(t\-\d\)|\w*\(t\+\d\)','match')); +% Copy EXPRESSION in expression. In the next loop we will remove all indexed variables from expression. +expression = EXPRESSION; + % Build an incidence table (max lag/lead for each variable) % % Column 1: Name of the variable. @@ -77,6 +80,7 @@ variables = unique(regexpi(EXPRESSION, '\w*\(t\)|\w*\(t\-\d\)|\w*\(t\+\d\)','mat leadlagtable = cell(0,6); % Loop over the variables (dseries objects). for i=1:length(variables) + expression = strrep(expression,variables{i},''); current = ~isempty(regexpi(variables{i},'\(t\)')); lag = ~isempty(regexpi(variables{i},'\(t\-\d\)')); lead = ~isempty(regexpi(variables{i},'\(t\+\d\)')); @@ -222,6 +226,13 @@ t2 = find(d2==tmp.dates); % Get data data = tmp.data; +% Isolate the (potential) parameters in the expression to be evaluated +[~, TMP314] = strsplit(expression,'([0-9]*\.[0-9]*|\w*)','DelimiterType','RegularExpression','CollapseDelimiters',false); +% Here I remove the numbers (TMP314 -> TMP314159). +TMP3141 = regexp(TMP314,'(([0-9]*\.[0-9]*)|([0-9]*))','match'); +TMP31415 = find(cellfun(@isempty,TMP3141)); +TMP314159 = TMP314(TMP31415); + if dynamicmodel % Transform EXPRESSION by replacing calls to the dseries objects by references to data. for i=1:number_of_variables @@ -235,6 +246,18 @@ if dynamicmodel EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(t+%s,%s)',num2str(lead),num2str(i))); end end + % Get values for the parameters (if any) + if ~isempty(TMP314159) + for i=1:length(TMP314159) + wordcandidate = TMP314159{i}; + try % If succesful, word is a reference to a variable in the caller function/script. + thiswordisaparameter = evalin('caller', wordcandidate); + eval(sprintf('%s = thiswordisaparameter;',wordcandidate)); + catch + % I assume that word is a reference to a function. + end + end + end % Do the job. Evaluate the recursion. eval(sprintf('for t=%s:%s, %s; end',num2str(t1),num2str(t2),EXPRESSION)); else @@ -254,6 +277,18 @@ else EXPRESSION = strrep(EXPRESSION,'^','.^'); EXPRESSION = strrep(EXPRESSION,'*','.*'); EXPRESSION = strrep(EXPRESSION,'/','./'); + % Get values for the parameters (if any) + if ~isempty(TMP314159) + for i=1:length(TMP314159) + wordcandidate = TMP314159{i}; + try % If succesful, word is a reference to a variable in the caller function/script. + thiswordisaparameter = evalin('caller', wordcandidate); + eval(sprintf('%s = thiswordisaparameter;',wordcandidate)); + catch + % I assume that word is a reference to a function. + end + end + end % Do the job. Evaluate the static expression. eval(sprintf('%s;',EXPRESSION)); end @@ -261,8 +296,6 @@ end % Put assigned variable back in the caller workspace... eval(sprintf('assignin(''caller'', ''%s'', dseries(data(:,indva),y.init,y.name,y.tex));',assignedvariablename)) - - function msg = get_error_message_0(msg) if ~nargin msg = sprintf('Wrong syntax! The correct syntax is:\n\n');