From 08b514f52b44d357bf4b7301dc9f97b6f580d6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?=
 <stepan@adjemian.eu>
Date: Fri, 13 Dec 2019 15:37:09 +0100
Subject: [PATCH] Fixed backcast method for older versions of Matlab and for
 Octave.

---
 src/@dseries/backcast_.m          |  4 ++--
 src/utilities/cumulate/rcumprod.m | 12 ++++++++++++
 src/utilities/cumulate/rcumsum.m  | 12 ++++++++++++
 3 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 src/utilities/cumulate/rcumprod.m
 create mode 100644 src/utilities/cumulate/rcumsum.m

diff --git a/src/@dseries/backcast_.m b/src/@dseries/backcast_.m
index 5020c7c..40bc368 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 0000000..54be58e
--- /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 0000000..db52f3d
--- /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
-- 
GitLab