WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

datestr 2 datenum performance

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 13.01.2010, 09:44     Titel: datestr 2 datenum performance
  Antworten mit Zitat      
Hallo,

ich erhalte Datum und die Zeit in einer Zelle. Beide stehen als String zur Verfügung. Insgesamt um die 50000 Zellen. Ich benötige diese aber als datenum Format. Ich wandle sie folgendermaßen um:

Code:

a = {'13.07.1999' '16:22:59'};
date = datenum(a{1}(:,1),'dd.mm.yyyy'); %11 Sec.
time = datenum(a{1}(:,2)); %9 Sec.
time = time - floor(time);
dt = date+time;
 


Existiert eine performantere Lösung? Vor allem was die Zeilen 2 und 3 angeht?

Danke Joe
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 13.01.2010, 09:56     Titel:
  Antworten mit Zitat      
Ich glaube, dass nicht die Performance der Konvertierungsbefehle an sich das Problem ist, sondern der Zugriff auf die Zellen.

Das Beispiel ist so nicht lauffähig. Wie sieht a genau aus (Mit 10 und nicht 50000 einträgen Smile )

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2010, 10:19     Titel:
  Antworten mit Zitat      
Hallo,

ein Vorschlag, um den Zugriff auf die Cells effizienter zu machen:
Code:

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.01.2010, 10:40     Titel:
  Antworten mit Zitat      
Hallo

ich glaube man kann es effizienter gestalten, ohne Schleifen ungefähr so

Code:

time_str = {'13.07.1999' '16:22:59'; '14.07.1999' '10:30:00'};

datum = datenum(char(time_str (:,1)),'dd.mm.yyyy');

zeit  = datenum(char(time_str (:,2)));
zeit  = zeit - floor(zeit);
dt     = datum+zeit
 
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 13.01.2010, 11:38     Titel:
  Antworten mit Zitat      
Hallo an alle Wink

vielen Dank für eure Vorschläge und sorry für das nicht funktionierende Beispiel.

Hier noch mal mit dem Vergliech der Ergebnisse des Vorschlags von denny.

Code:

%joe
tic
cs1 = cellstr([ '13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';
    '13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999' ]);
cs2 = cellstr([ '12:22:59';'13:25:59';'14:25:59';'15:25:59';'12:22:59';'13:25:59';
    '14:25:59';'15:25:59';'12:22:59';'13:25:59';'14:25:59';'15:25:59']);
a = {[cs1 cs2]};
date = datenum(a{1}(:,1),'dd.mm.yyyy'); %11 Sec.
time = datenum(a{1}(:,2)); %9 Sec.
time = time - floor(time);
dt1 = date+time;
toc
%denny
tic
datum = datenum(char(a{1}(:,1)),'dd.mm.yyyy');
zeit  = datenum(char(a{1}(:,2)));
zeit  = zeit - floor(zeit);
dt2     = datum+zeit;
toc
[dt1 dt2]


Elapsed time is 0.371930 seconds.
Elapsed time is 0.030698 seconds.

Könntest du mir denny bitte erklären, warum dein Code viel schneller ist?

Danke Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 13.01.2010, 11:52     Titel:
  Antworten mit Zitat      
Das ist interessant,

ich habe mich anscheinend zu früh gefreut. Die Tests mit 50000 Datensätzen haben dies ergeben:

%joe
Elapsed time is 21.863343 seconds.
%denny
Elapsed time is 29.215055 seconds.

Warum ist es so??? Bei vielen Datensätzen scheint meine Variante performater zu sein.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 13.01.2010, 12:38     Titel:
  Antworten mit Zitat      
Hallo,
mich würde interessieren, welche MATLAB Version und was für ein Rechner. Ich habe das Beispiel auf 60000 erweitert mit
Code:
cs1 = repmat(cs1, 5000, 1);
cs2 = repmat(cs2, 5000, 1);

und auf meinem (nicht wirklich überdurchschnittlichen) Laptop mit R2008b brauchen beide Versionen unter 2s...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 13.01.2010, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

so oder so, auch bei der Zeit würde ich das Format mitgeben, ist immer sicherer und schneller, als wenn MATLAB raten muss:
Code:
time = datenum(a{1}(:,2), 'HH:MM:SS');


Ciao,
Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 13.01.2010, 13:29     Titel:
  Antworten mit Zitat      
Hallo Titus,

mein Comp: intel core duo 2GHz, 4 GB Ram. Matlab 2009

Ka. ob das damit zu tun haben könnte (denke aber nicht), aber die genannte Funktion benutze ich innerhalb von einer Klassenmethode. Davor werden die Daten von einem File geladen, und anschließend umgewandelt.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 13.01.2010, 13:44     Titel:
  Antworten mit Zitat      
Hallo Joe,

also besser als mein Rechner Wink.
Könntest Du diesen Code einfach nochmal laufen lassen? Würde mich interessieren. So oder so, viel lässt sich da nicht mehr rausholen ...
Code:
%joe
cs1 = cellstr([ '13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';
    '13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999';'13.07.1999' ]);
cs2 = cellstr([ '12:22:59';'13:25:59';'14:25:59';'15:25:59';'12:22:59';'13:25:59';
    '14:25:59';'15:25:59';'12:22:59';'13:25:59';'14:25:59';'15:25:59']);
cs1 = repmat(cs1, 5000, 1);
cs2 = repmat(cs2, 5000, 1);
a = {[cs1 cs2]};
tic,
date = datenum(a{1}(:,1),'dd.mm.yyyy'); %11 Sec.
time = datenum(a{1}(:,2), 'HH:MM:SS'); %9 Sec.
time = time - floor(time);
dt1 = date+time;
t1 = toc


Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 13.01.2010, 13:53     Titel:
  Antworten mit Zitat      
Also

dein letztes Beispiel produzierte: t1 = 2.32

gegenüber dem code ohne ('HH:SS:SS') der mit 2,57 abgeschlossen hat.

Ich werde noch mal schauen warum der code als script schnell läuft, und innerhalb der Klasse viel langsamer. So weit vielen Dank für eure hilfe.


LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 13.01.2010, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

zu diesem Zweck würde ich den Profiler anschmeißen ...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.