2017-05-24 7 views
2

ich mit einem Datetime-Array s wie folgt aufgebaut arbeite:in einem Datum Array bestimmtes Datum findet

ds = datetime(2010,01,01,'TimeZone','Europe/Berlin'); 
de = datetime(2030,01,01,'TimeZone','Europe/Berlin'); 
s = ds:hours(1):de; 

I Funktion bin mit ismember in diesem Array das erste Vorkommen eines bestimmten Datums zu finden.

Die beiden Zeilen von oben werden in meiner Anwendung oft aufgerufen und verbrauchen ziemlich viel Zeit. Es ist für mich klar, dass Matlab ALLE Daten von s mit specificDate vergleicht, obwohl ich nur das erste Auftreten von specificDate in s benötige. Um die Anwendung zu beschleunigen, wäre es also gut, wenn Matlab den Vergleich specificDate mit s beendet, sobald die erste Übereinstimmung gefunden wurde.

Eine Lösung wäre eine While-Schleife, aber mit der While-Schleife wird die Anwendung noch langsamer (ich habe es versucht).

Haben Sie eine Idee, wie Sie dieses Problem umgehen können?

+0

'Startort = finden (s == specificDate, 1)' um den ersten Index zu finden, wo dein spezifisches Datum ist? – Wolfie

Antwort

1

Ich bin mir nicht sicher, was Ihr spezifischer Anwendungsfall hier ist, aber da die Schrittweite zwischen Elementen von s eine Stunde ist, wird Ihr Index einfach die Differenz in Stunden zwischen Ihrem spezifischen Datum und dem Startdatum sein , Plus eins. Keine Notwendigkeit zu schaffen oder durch s in erster Linie suchen:

startPlace = hours(specificDate-ds)+1; 

und ein Beispiel jede Lösung zu testen:

specificDate = datetime(2017, 1, 1, 'TimeZone', 'Europe/Berlin'); % Sample date 

ind = ismember(s, specificDate); % Compare to the whole vector 
startPlace = find(ind, 1);  % Find the index 

isequal(startPlace, hours(specificDate-ds)+1) % Check equality of solutions 

ans = 

    logical 

    1  % Same! 
1

Was Sie sich etwas Zeit sparen tun kann, ist die Datetime zu konvertieren ein datenum in einem solchen Fall werden Sie Zahlen statt Saiten zu vergleichen, die Ihre Bearbeitungszeit erheblich beschleunigt, wie folgt aus:

s_new = datenum(s); 
ind = ismember(s_new,datenum(specificDate)); 
startPlace = find(ind,1); 
Verwandte Themen