diff --git a/matlab/@dynDates/colon.m b/matlab/@dynDates/colon.m new file mode 100644 index 000000000..a1c143479 --- /dev/null +++ b/matlab/@dynDates/colon.m @@ -0,0 +1,152 @@ +function C = colon(varargin) % --*-- Unitary tests --*-- + +% Overloads the colon operator (:). This method can be used to create ranges of dates. +% +% INPUTS +% o A dynDates object with one element. +% o d integer scalar, number of periods between each date (default value, if nargin==2, is one) +% o B dynDates object with one element. +% +% OUTPUTS +% o C dynDates object with length(B-A) elements (if d==1). +% +% REMARKS +% B must be greater than A if d>0. + +% Copyright (C) 2013 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 . + +if isequal(nargin,2) + A = varargin{1}; + B = varargin{2}; + d = 1; + if ~(isa(A,'dynDates') && isa(B,'dynDates') && isequal(length(A),1) && isequal(length(B),1)) + error('dynDates::colon: In an expression like A:B, A and B must be dynDates objects!') + end +elseif isequal(nargin,3) + A = varargin{1}; + B = varargin{3}; + d = varargin{2}; + if ~(isa(A,'dynDates') && isa(B,'dynDates') && isequal(length(A),1) && isequal(length(B),1)) + error('dynDates::colon: In an expression like A:d:B, A and B must be dynDates objects and d a scalar integer (number of periods)!') + end + if ~(isscalar(d) && isint(d)) + error('dynDates::colon: In an expression like A:d:B, A and B must be dynDates objects and d a scalar integer (number of periods)!') + end + if isequal(d,0) + error('dynDates::colon: In an expression like A:d:B, d (the incremental number of periods) must nonzero!') + end +else + error('dynDates::colon: Wrong calling sequence! See the manual for the colon (:) operator and dynDates objects.') +end + +if ~isequal(A.freq,B.freq) + error(['dynDates::colon: Input arguments ' inputname(1) 'and ' inputname(2) ' must have common frequency!']) +end + +if A>B && d>0 + error(['dynDates::colon: ' inputname(1) ' must precede ' inputname(2) '!' ]) +end + +if B>A && d<0 + error(['dynDates::colon: ' inputname(2) ' must precede ' inputname(1) '!' ]) +end + +C = dynDates(); +n = (B-A)+1; +C.freq = A.freq; +C.ndat = n; +C.time = NaN(n,2); +C.time(1,:) = A.time; + +current_date = A; +linee = 1; + +while current_date