diff --git a/src/@dseries/backcast_.m b/src/@dseries/backcast_.m index 5020c7c9e1115b1a94453357af4d9cb30cac3124..40bc368068d40a75f1a05b5e3a09bda8abdbe906 100644 --- a/src/@dseries/backcast_.m +++ b/src/@dseries/backcast_.m @@ -42,11 +42,11 @@ idp = find(o.dates(1)==p.dates); if diff FirstDifference = p.data(2:idp,:)-p.data(1:idp-1,:); - CumulatedDifferences = cumsum(FirstDifference, 'reverse'); + CumulatedDifferences = rcumsum(FirstDifference); o.data = [bsxfun(@minus, o.data(1:end), CumulatedDifferences); o.data]; else GrowthFactor = p.data(2:idp,:)./p.data(1:idp-1,:); - CumulatedGrowthFactors = cumprod(GrowthFactor, 'reverse'); + CumulatedGrowthFactors = rcumprod(GrowthFactor); o.data = [bsxfun(@rdivide, o.data(1:end), CumulatedGrowthFactors); o.data]; end diff --git a/src/utilities/cumulate/rcumprod.m b/src/utilities/cumulate/rcumprod.m new file mode 100644 index 0000000000000000000000000000000000000000..54be58efc8df8ed4c33b1e72e7b7a6e516c4e45b --- /dev/null +++ b/src/utilities/cumulate/rcumprod.m @@ -0,0 +1,12 @@ +function Y = rcumprod(X) + +% Returns the cumulated product of X from bottom to top (reversed order +% compared to cumprod, emulate the `reverse` option). +% +% INPUTS +% - X [double] T×N array +% +% OUTPUTS +% - Y [double] T×N array + +Y = flip(cumprod(flip(X))); \ No newline at end of file diff --git a/src/utilities/cumulate/rcumsum.m b/src/utilities/cumulate/rcumsum.m new file mode 100644 index 0000000000000000000000000000000000000000..db52f3de0463b21e7023ba71cf13ebccd0bfceea --- /dev/null +++ b/src/utilities/cumulate/rcumsum.m @@ -0,0 +1,12 @@ +function Y = rcumsum(X) + +% Returns the cumulated sum of X from bottom to top (reversed order +% compared to cumsum, emulate the `reverse` option). +% +% INPUTS +% - X [double] T×N array +% +% OUTPUTS +% - Y [double] T×N array + +Y = flip(cumsum(flip(X))); \ No newline at end of file