diff --git a/matlab/@dynSeries/align.m b/matlab/@dynSeries/align.m new file mode 100644 index 000000000..d8b39b8ab --- /dev/null +++ b/matlab/@dynSeries/align.m @@ -0,0 +1,123 @@ +function [a,b] = align(a, b) + +%@info: +%! @deftypefn {Function File} {[@var{a}, @var{b}] =} merge_dates (@var{a}, @var{b}) +%! @anchor{dynSeries/align} +%! @sp 1 +%! If dynSeries objects @var{a} and @var{b} are defined on different time ranges, extend @var{a} and/or +%! @var{b} with NaNs so that they are defined on the same time range. +%! @sp 2 +%! @strong{Inputs} +%! @sp 1 +%! @table @ @var +%! @item a +%! Object instantiated by @ref{dynSeries}. +%! @item b +%! Object instantiated by @ref{dynSeries}. +%! @end table +%! @sp 2 +%! @strong{Outputs} +%! @sp 1 +%! @table @ @var +%! @item a +%! Object instantiated by @ref{dynSeries}. +%! @item b +%! Object instantiated by @ref{dynSeries}. +%! @end table +%! @end deftypefn +%@eod: + +% 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(a.freq,b.freq) + error(['dynSeries::merge_dates: ''' inputname(1) ''' and ''' inputname(2) ''' dynSeries objects must have common frequencies!']) +end + +init = min(a.init,b.init); + +time_range_of_a = a.init:a.init+a.nobs; +time_range_of_b = b.init:b.init+b.nobs; + +last_a = time_range_of_a(a.nobs); +last_b = time_range_of_b(b.nobs); + + +common_time_range = intersect(time_range_of_a,time_range_of_b); + +if isempty(common_time_range) + error(['dynSeries::merge_dates: ''' inputname(1) ''' and ''' inputname(2) ''' dynSeries object must have at least one common date!']) +end + +if a.initb.init + n = a.init-b.init; + a.data = [NaN(n,a.vobs); a.data]; + a.nobs = a.nobs+n; + a.init = init; +end + +if last_a>last_b + n = last_a-last_b; + b.data = [b.data; NaN(n,b.vobs)]; + b.nobs = b.nobs+n; + return +end + +if last_a