From 054500c7124a3c5b426e9170e4a5a9d79c3c562e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?=
 <stephane.adjemian@univ-lemans.fr>
Date: Wed, 14 May 2014 17:23:56 +0200
Subject: [PATCH] Improve speed of @dates/colon method.

---
 matlab/@dates/colon.m                             | 13 ++++---------
 .../dates/add_periods_to_array_of_dates.m         | 12 ++++++++----
 matlab/utilities/dates/string2date.m              | 15 ++++++++-------
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/matlab/@dates/colon.m b/matlab/@dates/colon.m
index 4449d9a3f6..76e78a2278 100644
--- a/matlab/@dates/colon.m
+++ b/matlab/@dates/colon.m
@@ -68,23 +68,18 @@ end
 
 C = dates();
 n = (B-A)+1;
+if d>1
+    n = length(1:d:n);
+end
 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<B
-    linee = linee+1;
+for linee=2:n
     C.time(linee,:) = add_periods_to_array_of_dates(C.time(linee-1,:), C.freq, d);
-    current_date = current_date + d;
 end
 
-C.time = C.time(1:linee,:);
-C.ndat = rows(C.time);
-
 %@test:1
 %$ % Define two dates
 %$ date_1 = '1950Q2';
diff --git a/matlab/utilities/dates/add_periods_to_array_of_dates.m b/matlab/utilities/dates/add_periods_to_array_of_dates.m
index 7274a1a785..48a371739a 100644
--- a/matlab/utilities/dates/add_periods_to_array_of_dates.m
+++ b/matlab/utilities/dates/add_periods_to_array_of_dates.m
@@ -27,12 +27,16 @@ time(:,1) = time(:,1) + fix(p/freq);
 time(:,2) = time(:,2) + rem(p,freq);
 
 id1 = find(time(:,2)>freq);
-time(id1,1) = time(id1,1) + 1;
-time(id1,2) = time(id1,2) - freq;
+if ~isempty(id1)
+    time(id1,1) = time(id1,1) + 1;
+    time(id1,2) = time(id1,2) - freq;
+end
 
 id2 = find(time(:,2)<1);
-time(id2,1) = time(id2,1) - 1;
-time(id2,2) = time(id2,2) + freq;
+if ~isempty(id2)
+    time(id2,1) = time(id2,1) - 1;
+    time(id2,2) = time(id2,2) + freq;
+end
 
 %@test:1
 %$ t(1) = dyn_assert(add_periods_to_array_of_dates([1950 1], 4, 1),[1950 2]);
diff --git a/matlab/utilities/dates/string2date.m b/matlab/utilities/dates/string2date.m
index 139b65dbf4..bb91a05fb3 100644
--- a/matlab/utilities/dates/string2date.m
+++ b/matlab/utilities/dates/string2date.m
@@ -26,7 +26,7 @@ end
 if isyearly(a)
     year = 1:(regexp(a,'[AaYy]')-1);
     date.freq = 1;
-    date.time = write_time_field(a, year);
+    date.time = write_time_field_y(a, year);
     return
 end
 
@@ -51,13 +51,14 @@ if isweekly(a)
     return
 end
 
+
 function b = write_time_field(c, d)
-    b(1) = str2num(c(d));
-    if ismember(c(d(end)+1),{'Y','y','A','a'})
-        b(2) = 1;
-    else
-        b(2) = str2num(c(d(end)+2:end));
-    end
+    b(1) = str2double(c(d));
+    b(2) = str2double(c(d(end)+2:end));
+
+function b = write_time_field_y(c, d)
+    b(1) = str2double(c(d));
+    b(2) = 1;
 
 %@test:1
 %$
-- 
GitLab