diff --git a/matlab/utilities/dseries/from.m b/matlab/utilities/dseries/from.m index 596d0a86cdc56d7139cb58499d1ea3128f99b343..fd5686cae4c37e99bbaf93d64cf189ac12db4268 100644 --- a/matlab/utilities/dseries/from.m +++ b/matlab/utilities/dseries/from.m @@ -87,7 +87,7 @@ end 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')); +variables = unique(regexpi(EXPRESSION, '\w*\(t\)|\w*\(t\-\d\)|\w*\(t\+\d\)|\w*\.\w*\(t\)|\w*\.\w*\(t\-\d\)|\w*\.\w*\(t\+\d\)','match')); % Copy EXPRESSION in expression. In the next loop we will remove all indexed variables from expression. expression = EXPRESSION; @@ -174,10 +174,26 @@ variable_names = cell(1); % the lags and leads) and check that each object is a singleton for i=1:number_of_variables current_variable = leadlagtable{i,1}; + idvar = strfind(current_variable,'.'); + if isempty(idvar) + idvar = 0; + end + if idvar + current_variable_0 = current_variable(1:idvar-1); + else + current_variable_0 = current_variable; + end try - var = evalin('caller',current_variable); + var = evalin('caller',current_variable_0); catch - error(['dseries::from: Variable ' current_variable ' is unknown!']) + error(['dseries::from: Variable ' current_variable_0 ' is unknown!']) + end + if idvar + try + eval(sprintf('var = var.%s;',current_variable(idvar+1:end))) + catch + error(sprintf('dseries::from: Variable %s is not a member of dseries oject %s!', current_variable(idvar+1:end), current_variable_0)) + end end if ~isdseries(var) error(['dseries::from: Variable ' current_variable ' is not a dseries object!']) @@ -220,7 +236,7 @@ if isempty(equal_id) end if isequal(length(equal_id),1) % Get the name of the assigned variable (with time index) - assignedvariablename = regexpi(EXPRESSION(1:equal_id-1), '\w*\(t\)|\w*\(t\-\d\)|\w*\(t\+\d\)','match'); + assignedvariablename = regexpi(EXPRESSION(1:equal_id-1), '\w*\(t\)|\w*\(t\-\d\)|\w*\(t\+\d\)|\w*\.\w*\(t\)|\w*\.\w*\(t\-\d\)|\w*\.\w*\(t\+\d\)','match'); if isempty(assignedvariablename) error('dseries::from: Wrong syntax! The expression following the DO keyword must be an assignment (missing variable before the equal symbol).') end @@ -232,7 +248,8 @@ if isequal(length(equal_id),1) index = assignedvariablename{1}(start:end); assignedvariablename = assignedvariablename{1}(1:start-1); indva = strmatch(assignedvariablename, leadlagtable(:,1)); - dynamicmodel = ~isempty(regexpi(EXPRESSION(equal_id:end), sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match')); + dynamicmodel = ~isempty(regexpi(EXPRESSION(equal_id:end), ... + sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match')); % Check that the dynamic model for the endogenous variable is not forward looking. if dynamicmodel indum = index2num(index); @@ -242,7 +259,8 @@ if isequal(length(equal_id),1) end % Check that the assigned variable does not depend on itself (the assigned variable can depend on its past level but not on the current level). if dynamicmodel - tmp = regexpi(EXPRESSION(equal_id+1:end), sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match'); + tmp = regexpi(EXPRESSION(equal_id+1:end), ... + sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match'); tmp = cellfun(@extractindex, tmp); tmp = cellfun(@index2num, tmp); if ~all(tmp(:)<indum) @@ -280,11 +298,13 @@ if dynamicmodel EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}),sprintf('data(t,%s)',num2str(i))); for j=1:length(leadlagtable{i,5}) lag = leadlagtable{i,5}(j); - EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t-%s\\)',leadlagtable{i,1},num2str(lag)),sprintf('data(t-%s,%s)',num2str(lag),num2str(i))); + EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t-%s\\)',leadlagtable{i,1},num2str(lag)), ... + sprintf('data(t-%s,%s)',num2str(lag),num2str(i))); end for j=1:length(leadlagtable{i,6}) lead = leadlagtable{i,6}(j); - EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(t+%s,%s)',num2str(lead),num2str(i))); + 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) @@ -304,14 +324,17 @@ if dynamicmodel else % Transform EXPRESSION by replacing calls to the dseries objects by references to data. for i=1:number_of_variables - EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}),sprintf('data(%s:%s,%s)',num2str(t1),num2str(t2),num2str(i))); + EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}), ... + sprintf('data(%s:%s,%s)',num2str(t1),num2str(t2),num2str(i))); for j=1:length(leadlagtable{i,5}) lag = leadlagtable{i,5}(j); - EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t-%s\\)',leadlagtable{i,1},num2str(lag)),sprintf('data(%s:%s,%s)',num2str(t1-lag),num2str(t2-lag),num2str(i))); + EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t-%s\\)',leadlagtable{i,1},num2str(lag)), ... + sprintf('data(%s:%s,%s)',num2str(t1-lag),num2str(t2-lag),num2str(i))); end for j=1:length(leadlagtable{i,6}) lead = leadlagtable{i,6}(j); - EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(%s:%s,%s)',num2str(t1-lead),num2str(t2-lead),num2str(i))); + EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)), ... + sprintf('data(%s:%s,%s)',num2str(t1-lead),num2str(t2-lead),num2str(i))); end end % Transform some operators (^ -> .^, / -> ./ and * -> .*) @@ -335,7 +358,15 @@ else end % Put assigned variable back in the caller workspace... -eval(sprintf('assignin(''caller'', ''%s'', dseries(data(:,indva),y.init,y.name,y.tex));',assignedvariablename)) +if isempty(strfind(assignedvariablename,'.')) + eval(sprintf('assignin(''caller'', ''%s'', dseries(data(:,indva),%s.init,%s.name,%s.tex));', ... + assignedvariablename,assignedvariablename,assignedvariablename,assignedvariablename)) +else + DATA = num2cell(data(:,indva)); + strdata = sprintf('%f ', DATA{:}); + evalin('caller',sprintf('%s = dseries(transpose([%s]),%s.init,%s.name,%s.tex)', ... + assignedvariablename,strdata,assignedvariablename,assignedvariablename,assignedvariablename)) +end function msg = get_error_message_0(msg) if ~nargin