diff --git a/doc/dynare.texi b/doc/dynare.texi index 54a7ac3a5d23db70c40a44cf1c7890e16e2db164..88e084fd2d2bb7017a00195a486d2d3b99d930ff 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -9552,8 +9552,9 @@ A @code{nobs} by @code{vobs} array of doubles, the data. @deftypefn {dseries} dseries () @deftypefnx {dseries} dseries (@var{INITIAL_DATE}) +@deftypefnx {dseries} dseries (@var{RANGE_OF_DATES}) -Instantiates an empty @dseries object, with, if defined, an initial date given by the single element @dates object @var{INITIAL_DATE} (the frequency is then set accordingly). +Instantiates an empty @dseries object, with, if defined, an initial date given by the single element @dates object @var{INITIAL_DATE} or the first element of the @dates object @var{RANGE_OF_DATES} (the frequency is then set accordingly). @end deftypefn @@ -9579,8 +9580,9 @@ If a @file{.mat} file is used instead, it should provide the same informations. @sp 1 @deftypefn {dseries} dseries (@var{DATA_MATRIX}[, @var{INITIAL_DATE}[, @var{LIST_OF_NAMES}[, @var{LIST_OF_TEX_NAMES}]]]) +@deftypefn {dseries} dseries (@var{DATA_MATRIX}[, @var{RANGE_OF_DATES}[, @var{LIST_OF_NAMES}[, @var{LIST_OF_TEX_NAMES}]]]) -If the data is not read from a file, it can be provided via a @math{T}x@math{N} matrix as the first argument to @code{dseries}' constructor, with @math{T} representing the number of observations on @math{N} variables. The optional second argument, @var{INITIAL_DATE}, can be either a @dates object representing the period of the first observation or a string which would be used to instantiate a @dates object. Its default value is @code{dates('1Y')}. The optional third argument, @var{LIST_OF_NAMES}, is a @math{N} by @math{1} cell of strings with one entry for each variable name. The default name associated with column @code{i} of @var{DATA_MATRIX} is @code{Variable_i}. The final argument, @var{LIST_OF_TEX_NAMES}, is a @math{N} by @math{1} cell of strings composed of the @LaTeX{} names associated with the variables. The default @LaTeX{} name associated with column @code{i} of @var{DATA_MATRIX} is @code{Variable\_i}. +If the data is not read from a file, it can be provided via a @math{T}x@math{N} matrix as the first argument to @code{dseries}' constructor, with @math{T} representing the number of observations on @math{N} variables. The optional second argument, @var{INITIAL_DATE}, can be either a @dates object representing the period of the first observation or a string which would be used to instantiate a @dates object. Its default value is @code{dates('1Y')}. The optional third argument, @var{LIST_OF_NAMES}, is a @math{N} by @math{1} cell of strings with one entry for each variable name. The default name associated with column @code{i} of @var{DATA_MATRIX} is @code{Variable_i}. The final argument, @var{LIST_OF_TEX_NAMES}, is a @math{N} by @math{1} cell of strings composed of the @LaTeX{} names associated with the variables. The default @LaTeX{} name associated with column @code{i} of @var{DATA_MATRIX} is @code{Variable\_i}. If the optional second input argument is a range of dates, @dates object @var{RANGE_OF_DATES}, the number of rows in the first argument must match the number of elements @var{RANGE_OF_DATES} or be equal to one (in which case the single observation is replicated). @end deftypefn diff --git a/matlab/@dseries/dseries.m b/matlab/@dseries/dseries.m index a4596d66290f19c7425fdfb012170b01b41aa920..7fb9427efa619ae5f9de2508e5dcbce62e1eba46 100644 --- a/matlab/@dseries/dseries.m +++ b/matlab/@dseries/dseries.m @@ -103,7 +103,10 @@ switch nargin ts.init = varargin{1}; ts.freq = varargin{1}.freq; otherwise - error(['dseries::dseries: Input ' inputname(1) ' (identified as a dates object) must have only one element!']) + % A range of dates is passed to the constructor + ts.dates = varargin{1}; + ts.init = varargin{1}(1); + ts.freq = varargin{1}.freq; end return elseif ischar(varargin{1}) @@ -173,19 +176,37 @@ switch nargin if isempty(b) ts.freq = 1; ts.init = dates(1,1); - else - if isdate(b)% Weekly, Monthly, Quaterly or Annual data. - ts.init = dates(b); - ts.freq = ts.init.freq; - elseif isdates(b) && isequal(length(b),1) - ts.freq = b.freq; - ts.init = b; - elseif isnumeric(b) && isscalar(b) && isint(b) % Yearly data. - ts.freq = 1; - ts.init = dates([num2str(b) 'Y']); - else - error('dseries::dseries: Wrong calling sequence!'); + elseif (isdates(b) && isequal(length(b),1)) + ts.freq = b.freq; + ts.init = b; + elseif isdate(b)% Weekly, Monthly, Quaterly or Annual data (string). + ts.init = dates(b); + ts.freq = ts.init.freq; + elseif (isnumeric(b) && isscalar(b) && isint(b)) % Yearly data. + ts.freq = 1; + ts.init = dates([num2str(b) 'Y']); + elseif isdates(b) % Range of dates + ts.freq = b.freq; + ts.init = b(1); + if ts.nobs>1 && ~isequal(b.ndat,ts.nobs) + message = 'dseries::dseries: If second input is a range, its number of elements must match '; + message = char(message, ' the number of rows in the first input, unless the first input'); + message = char(message, ' has only one row.'); + skipline() + disp(message); + error(' '); + elseif isequal(ts.nobs, 1) + ts.data = repmat(ts.data,b.ndat,1); + ts.nobs = b.ndat; end + ts.dates = b; + elseif (isnumeric(b) && isint(b)) % Range of yearly dates. + message = 'dseries::dseries: Not implemented! If you need to define a range of years'; + message = char(message, ' you have to pass a dates object as the second input argument.'); + disp(message) + error(' ') + else + error('dseries::dseries: Wrong calling sequence!'); end % Get the names of the variables. if ~isempty(c) @@ -214,7 +235,9 @@ switch nargin error('dseries::dseries: Can''t instantiate the class, wrong calling sequence!') end -ts.dates = ts.init:ts.init+(ts.nobs-1); +if isempty(ts.dates) + ts.dates = ts.init:ts.init+(ts.nobs-1); +end %@test:1 %$ % Test if we can instantiate an empty dseries object. @@ -464,4 +487,58 @@ ts.dates = ts.init:ts.init+(ts.nobs-1); %$ end %$ %$ T = all(t); -%@eof:12 \ No newline at end of file +%@eof:12 + +%@test:13 +%$ t = zeros(6,1); +%$ +%$ try +%$ ts = dseries(transpose(1:4),dates('1990Q1'):dates('1990Q4')); +%$ t(1) = 1; +%$ catch +%$ t = 0; +%$ end +%$ +%$ if length(t)>1 +%$ t(2) = dyn_assert(ts.freq,4); +%$ t(3) = dyn_assert(ts.init.freq,4); +%$ t(4) = dyn_assert(ts.init.time,[1990, 1]); +%$ t(5) = dyn_assert(ts.vobs,1); +%$ t(6) = dyn_assert(ts.nobs,4); +%$ end +%$ +%$ T = all(t); +%@eof:13 + +%@test:14 +%$ t = zeros(7,1); +%$ +%$ try +%$ ts = dseries([1, 2],dates('1990Q1'):dates('1990Q4')); +%$ t(1) = 1; +%$ catch +%$ t = 0; +%$ end +%$ +%$ if length(t)>1 +%$ t(2) = dyn_assert(ts.freq,4); +%$ t(3) = dyn_assert(ts.init.freq,4); +%$ t(4) = dyn_assert(ts.init.time,[1990, 1]); +%$ t(5) = dyn_assert(ts.vobs,2); +%$ t(6) = dyn_assert(ts.nobs,4); +%$ t(7) = dyn_assert(ts.data, [ones(4,1), 2*ones(4,1)]); +%$ end +%$ +%$ T = all(t); +%@eof:14 + +%@test:15 +%$ try +%$ ts = dseries([1; 2],dates('1990Q1'):dates('1990Q4')); +%$ t = 0; +%$ catch +%$ t = 1; +%$ end +%$ +%$ T = all(t); +%@eof:15