Verfasst am: 03.03.2021, 13:35
Titel: Iterative Vergleiche mit if und while noch beschleunigen
Hallo zusammen,
als Anfänger in MatLab habe ich hier eine Frage zur Laufoptimierung eines MatLab-Codes.
Gegeben ist eine Liste/Zeitreihe mit ca. 35.000 Messwerten über ein ganzes Jahr mit Datum und Uhrzeit.
Anhand des Datums und der Zeit soll nun gefiltert werden, ob die jeweiligen Zeilen ein Wochentag sind und, ob sie zusätzlich in ein bestimmtes Monats- und Zeitfenster fallen. Falls die drei Bedingungen erfüllt sind, soll der Messwert der Zeile in eine neue Spalte geschrieben werden.
Realisiert habe ich es erstmal iterativ mit while und if Schleifen, das ganze dauert ca. 12 Sekunden.
Lässt sich der Ablauf noch verschlanken und beschleunigen?
Code:
%In Spalte 1 der Liste steht das Datum (datetime).
%In Spalte 2 steht die Uhrzeit (excel-Format).
%In Spalte 3 stehen die Messwerte.
nData=size(Liste,1); %Der Zähler nData wird auf die Menge der Messwerte gesetzt.
n=1;
Frue1von=ZeitfensterEingabe{1,2}+ZeitfensterEingabe{1,3}/60;
Frue1bis=ZeitfensterEingabe{1,4}+ZeitfensterEingabe{1,5}/60;
%..
%..
%... Für jede Jahreszeit werden hier die Zeitfenster eingegeben.
Auch die Logik für die Bestimmung der Jahreszeit wundert mich. Wozu braucht man da drei verschiedene Zeitfenster?
Logische Indizierung / Zuweisung könnte das while/if ersetzen. Dazu wäre gut zu wissen, ob Intervalle wie [Frue1von, Frue1bis] und [Frue2von, Frue2bis] überlappend sind.
Ein reproduzierbares Beispiel ist generell hilfreich.
Zitat:
%In Spalte 2 steht die Uhrzeit (excel-Format).
Ich wüsste nicht, dass es in Excel genau ein Format für die Uhrzeit gibt - und noch weniger, wie man damit rechnen sollte.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Normalerweise kann Matlab sehr gut und schnell mit Matritzen arbeiten.
D.h. direkte Indexierung einer MAtrix könnte schneller sein.
Somit würde ich die Cellmatrix in eine num. Matrix umwandeln und direkt mit den Indexen arbeiten.
Den restlichen Code habe ich so gelassen, da ich noch nicht auf die Umsetzung der (logischen) Indizierung gekommen bin. Ich arbeite noch mit den If-Schleifen. Die Rechenzeit hat sich nur durch die Matrix von ca. 30 sek. auf 0,26 sek. reduziert.
Hallo Harald, dass nach jeder Bedingung die gleiche Anweisung steht, ist mir auch bewusst. Da habe ich noch keine Vereinfachung. Es sollen die Messwerte zu diesen Jahreszeiten und Uhrzeiten in die 7. Spalte geschrieben, also vom Rest gefiltert werden. Die Zeitfenster / Intervalle überlappen nicht.
Bei mir liegt die Uhrzeit im Format 0 Uhr=0 und 12 Uhr=0.5 aus Excel vor, welches in ein dezimales Format umgewandelt wird, 13:15 Uhr = 13.25.
Mich interessiert gerade die logische Indizierung, um die Schleifen zu ersetzen. Da werde ich mal weiterarbeiten.
1)Geht folgendes..? Mit der Indizierung Werte aus einer Spalte in eine andere Spalte der gleichen Zeile schreiben, wenn die Bedingung der Indizierung erfüllt ist?
In Worten: In der 7. Spalte werden die Zeilen 1 gesetzt, wenn die Werte der Zeilen on 5. Spalte zwischen 2 und 6 liegt.
Kann man nun auch schreiben, dass statt einer 1 die Zeile gleich dem Wert einer anderen Spalte (z.b. Messwert) auf gleicher "Höhe" /Zeile gesetzt wird?
Etwa so:
Code:
mat(mat(:,5)>=2 & mat(:,5)<=6,7)=Wert aus Spalte 3 gleicher Zeile in Spalte 7 dieser Zeile schreiben
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
1) War mir eine gute Grundlage, um weiterzuentwickeln.
2) Hat genau gepasst. Eine isbetween-Funktion habe ich nicht gebraucht.
Viele Grüße
Einstellungen und Berechtigungen
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
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.