diff --git a/matlab/@dynDate/minus.m b/matlab/@dynDate/minus.m
deleted file mode 100644
index 6546a2676..000000000
--- a/matlab/@dynDate/minus.m
+++ /dev/null
@@ -1,110 +0,0 @@
-function c = minus(a,b) % --*-- Unitary tests --*--
-
-%@info:
-%! @deftypefn {Function File} {@var{c} =} minus (@var{a},@var{b})
-%! @anchor{@dynDate/minus}
-%! @sp 1
-%! Overloads the minus (soustraction) operator for the Dynare dates class (@ref{dynDate}). Depending on the frequency, computes the number
-%! of years, quarters, months, weeks between two dates @var{a} and @var{b} (it is assumed that @var{a}>@var{B}).
-%! @sp 2
-%! @strong{Inputs}
-%! @sp 1
-%! @table @ @var
-%! @item a
-%! Dynare date object instantiated by @ref{dynDate}.
-%! @item b
-%! Dynare date object instantiated by @ref{dynDate}.
-%! @end table
-%! @sp 1
-%! @strong{Outputs}
-%! @sp 1
-%! @table @ @var
-%! @item c
-%! Integer scalar, the number of years, quarters, months or weeks between @var{a} and @var{B}.
-%! @end table
-%! @sp 2
-%! @strong{This function is called by:}
-%! @sp 2
-%! @strong{This function calls:}
-%! @ref{@@dynDate/eq},@ref{@@dynDate/lt}
-%!
-%! @end deftypefn
-%@eod:
-
-% Copyright (C) 2011-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 ~( isa(a,'dynDate') && isa(b,'dynDate') )
- error(['dynDate::minus: Input arguments ' inputname(1) ' and ' inputname(2) ' must be dynDate objects!'])
-end
-
-if a.freq~=b.freq
- error(['dynDate::minus: ' inputname(1) ' and ' inputname(2) ' must have common frequency!'])
-end
-
-if a.
-if isempty(B)
- C = A;
- return
-end
-
-if isempty(A)
- C = dynDates();
- return
-end
-
-if ~isequal(A.freq,B.freq)
- C = A;
- return
-end
-
-D = intersect(A,B);
-
-if isempty(D)
- C = A;
-else
+if isa(A,'dynDates') && isa(B,'dynDates')
+ % Concatenate dynDates objects without removing repetitions if A and B are not disjoint sets of dates.
+ if ~isequal(A.freq,B.freq)
+ error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' must have common frequencies!'])
+ end
+ if isempty(A) || isempty(B)
+ error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' must not be empty!'])
+ end
+ if ~isequal(length(A),length(B))
+ if length(A)==1
+ A.time = repmat(A.time,B.ndat,1);
+ A.ndat = B.ndat;
+ elseif length(B)==1
+ B.time = repmat(B.time,A.ndat,1);
+ B.ndat = A.ndat;
+ else
+ error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' lengths are not consistent!'])
+ end
+ end
+ C = zeros(length(A),1);
+ id = find(~(A==B));
+ if isempty(id)
+ return
+ end
+ C(id) = A.time(id,2)-B.time(id,2) + (A.time(id,1)-B.time(id,1))*A.freq;
+elseif isa(A,'dynDates') && ( (isvector(B) && isequal(length(B),A.ndat) && all(isint(B))) || isscalar(B) && isint(B) || isequal(length(A),1) && isvector(B) && all(isint(B)))
C = dynDates();
C.freq = A.freq;
- C.time = setdiff(A.time,D.time,'rows');
+ C.time = add_periods_to_array_of_dates(A.time, A.freq, -B);
C.ndat = rows(C.time);
+elseif isa(B,'dynDates') && ( (isvector(A) && isequal(length(A),B.ndat) && all(isint(A))) || isscalar(A) && isint(A) )
+ C = dynDates();
+ C.freq = A.freq;
+ C.time = add_periods_to_array_of_dates(B.time, B.freq, -A);
+ C.ndat = rows(C.time);
+else
+ error('dynDates::plus: I don''t understand what you want to do! Check the manual.')
end
%@test:1
%$ % Define some dynDates objects
-%$ d1 = dynDate('1950Q1'):dynDate('1959Q4') ;
-%$ d2 = dynDate('1960Q1'):dynDate('1969Q4') ;
-%$ d3 = d1+d2;
-%$
+%$ d1 = dynDates('1950Q1','1950Q2','1960Q1');
+%$ d2 = dynDates('1950Q3','1950Q4','1960Q1');
+%$ d3 = dynDates('2000Q1');
+%$ d4 = dynDates('2002Q2');
%$ % Call the tested routine.
-%$ e1 = d1-d2;
-%$ e2 = d3-d1;
+%$ try
+%$ e1 = d2-d1;
+%$ e2 = d4-d3;
+%$ t(1) = 1;
+%$ catch
+%$ t(1) = 0;
+%$ end
%$
-%$ % Check the results.
-%$ t(1) = dyn_assert(e1==d1,1);
-%$ t(2) = dyn_assert(e2==d2,1);
+%$ if t(1)
+%$ t(2) = dyn_assert(e1,[2; 2; 0]);
+%$ t(3) = dyn_assert(e2,9);
+%$ end
%$ T = all(t);
-%@eof:1
\ No newline at end of file
+%@eof:1
+
+%@test:2
+%$ % Define some dynDates objects
+%$ d1 = dynDates('1950Y','1951Y','1953Y');
+%$ d2 = dynDates('1951Y','1952Y','1953Y');
+%$ d3 = dynDates('2000Y');
+%$ d4 = dynDates('1999Y');
+%$ % Call the tested routine.
+%$ try
+%$ e1 = d2-d1;
+%$ e2 = d4-d3;
+%$ t(1) = 1;
+%$ catch
+%$ t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = dyn_assert(e1,[1; 1; 0]);
+%$ t(3) = dyn_assert(e2,-1);
+%$ end
+%$ T = all(t);
+%@eof:2
+
+%@test:3
+%$ % Define some dynDates objects
+%$ d1 = dynDates('2000Y');
+%$ d2 = dynDates('1999Y');
+%$ % Call the tested routine.
+%$ try
+%$ e1 = d1-1;
+%$ e2 = d2-(-1);
+%$ t(1) = 1;
+%$ catch
+%$ t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = dyn_assert(isequal(e1,d2),1);
+%$ t(3) = dyn_assert(isequal(e2,d1),1);
+%$ end
+%$ T = all(t);
+%@eof:3
+
+%@test:4
+%$ % Define some dynDates objects
+%$ d1 = dynDates('2000Q1');
+%$ e1 = dynDates('1999Q4','1999Q3','1999Q2','1999Q1','1998Q4');
+%$ % Call the tested routine.
+%$ try
+%$ f1 = d1-transpose(1:5);
+%$ t(1) = 1;
+%$ catch
+%$ t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = dyn_assert(isequal(e1,f1),1);
+%$ end
+%$ T = all(t);
+%@eof:4
+
+%@test:5
+%$ % Define some dynDates objects
+%$ d1 = dynDates('1999Q4','1999Q3','1999Q2','1999Q1','1998Q4');
+%$ e1 = dynDates('2000Q1')*5;
+%$ % Call the tested routine.
+%$ try
+%$ f1 = d1-(-transpose(1:5));
+%$ t(1) = 1;
+%$ catch
+%$ t(1) = 0;
+%$ end
+%$
+%$ if t(1)
+%$ t(2) = dyn_assert(isequal(e1,f1),1);
+%$ end
+%$ T = all(t);
+%@eof:5
\ No newline at end of file