From 7e849f01ad2a5b01f5287f79a1bec81aa5171df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Wed, 22 Jan 2020 15:32:38 +0100 Subject: [PATCH] Code factorization. --- ...get_variables_and_parameters_in_equation.m | 28 ++----------- ...t_variables_and_parameters_in_expression.m | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 matlab/get_variables_and_parameters_in_expression.m diff --git a/matlab/get_variables_and_parameters_in_equation.m b/matlab/get_variables_and_parameters_in_equation.m index dcecca2d1..babd9e0d7 100644 --- a/matlab/get_variables_and_parameters_in_equation.m +++ b/matlab/get_variables_and_parameters_in_equation.m @@ -15,7 +15,7 @@ function [pnames, enames, xnames, pid, eid, xid] = get_variables_and_parameters_ % - eid [Integer] n*1 vector of indices in M_.endo_names for the listed parameters in endogenous. % - xid [Integer] m*1 vector of indices in M_.exo_names for the listed parameters in exogenous. -% Copyright (C) 2018-2019 Dynare Team +% Copyright (C) 2018-2020 Dynare Team % % This file is part of Dynare. % @@ -33,30 +33,10 @@ function [pnames, enames, xnames, pid, eid, xid] = get_variables_and_parameters_ % along with Dynare. If not, see . % Get the tokens in the rhs member of the equation. -rhs_ = strsplit(rhs,{'+','-','*','/','^', ... - 'log(', 'log10(', 'ln(', 'exp(', ... - 'sqrt(', 'abs(', 'sign(', ... - 'sin(', 'cos(', 'tan(', 'asin(', 'acos(', 'atan(', ... - 'min(', 'max(', ... - 'normcdf(', 'normpdf(', 'erf(', ... - 'diff(', 'adl(', '(', ')', '\n', '\t', ' '}); +rhs_ = get_variables_and_parameters_in_expression(rhs); % Get the tokens in the lhs member of the equation. -lhs_ = strsplit(lhs, {'+','-','*','/','^', ... - 'log(', 'log10(', 'ln(', 'exp(', ... - 'sqrt(', 'abs(', 'sign(', ... - 'sin(', 'cos(', 'tan(', 'asin(', 'acos(', 'atan(', ... - 'min(', 'max(', ... - 'normcdf(', 'normpdf(', 'erf(', ... - 'diff(', 'adl(', '(', ')'}); - -% Filter out the numbers and punctuation. -rhs_(cellfun(@(x) all(isstrprop(x, 'digit')+isstrprop(x, 'punct')), rhs_)) = []; -lhs_(cellfun(@(x) all(isstrprop(x, 'digit')+isstrprop(x, 'punct')), lhs_)) = []; - -% Filter out empty elements. -rhs_(cellfun(@(x) all(isempty(x)), rhs_)) = []; -lhs_(cellfun(@(x) all(isempty(x)), lhs_)) = []; +lhs_ = get_variables_and_parameters_in_expression(lhs); % Get list of parameters. pnames = DynareModel.param_names; @@ -68,7 +48,7 @@ enames = intersect([rhs_, lhs_], enames); % Get list of exogenous variables xnames = DynareModel.exo_names; -xnames = intersect([rhs_, lhs_], xnames); +xnames = intersect([rhs_,lhs_], xnames); % Returns vector of indices for parameters endogenous and exogenous % variables if required. diff --git a/matlab/get_variables_and_parameters_in_expression.m b/matlab/get_variables_and_parameters_in_expression.m new file mode 100644 index 000000000..1af17ebbc --- /dev/null +++ b/matlab/get_variables_and_parameters_in_expression.m @@ -0,0 +1,40 @@ +function objects = get_variables_and_parameters_in_expression(expr) + +% Returns the variables and parameters appearing in an expression. +% +% INPUTS +% - expr [char] 1×m char array, dynare model expression (typically RHS or LHS of an equation). +% +% OUTPUTS +% - objects [cell] cell of row char arrays, names of the variables and parameters in expr. + +% Copyright (C) 2020 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . + +objects = strsplit(expr, {'+','-','*','/','^', ... + 'log(', 'log10(', 'ln(', 'exp(', ... + 'sqrt(', 'abs(', 'sign(', ... + 'sin(', 'cos(', 'tan(', 'asin(', 'acos(', 'atan(', ... + 'min(', 'max(', ... + 'normcdf(', 'normpdf(', 'erf(', ... + 'diff(', 'adl(', '(', ')', '\n', '\t', ' '}); + +% Filter out the numbers, punctuation. +objects(cellfun(@(x) all(isstrprop(x, 'digit')+isstrprop(x, 'punct')), objects)) = []; + +% Filter out empty elements. +objects(cellfun(@(x) all(isempty(x)), objects)) = []; \ No newline at end of file