Hallo liebe Mitnutzer,
ich bin über ein Stückchen langsamen Code gestolpert und habe bisher keine sinnvolle Lösung dazu gefunden:
Ich habe ca. 1000 Messungen mit der 900000x8 table 'RawData'. Darin habe ich auf einem Kanal einen Zeitstempel 'Time_Ch1_s' mit dazugehörigen gemessenen Geschwindigkeiten 'Velocity_Ch1_mps'.
Weiterhin gibt es einen externen Input mit einem periodischen HIGH Signal 'Analog_Extern_Inpt_Ch1_1' mit eigener Zeitskala 'Extern_Input_Time_s'.
Immer wenn der externe Input >50 ist, ist eine volle Umdrehung abgeschlossen und eine neue beginnt (ca. 5000 mal).
Ich würde gerne die gemessenen Geschwindigkeiten mit den Umdrehungen normieren. Sprich, statt 500 Messpunkte / Umdrehung, alle in einer Umdrehung dargestellen.
Mein Code war unsauber mit zwei for-Schleifen (und lief, bis ich gerade die Bedingungen sauberer aufschreiben wollte):
Code:
%Reihe, bei der Winkelgeber HIGH (>50) ist
ReihewennWinkelgeberHigh=find(any((RawData{:,'Analog_Extern_Input_Ch1_1'})>50,2));
%Normierung auf eine Umdrehung Ch1
%Endbedingung 1
j_end=(ceil(RawData{ReihewennWinkelgeberHigh(numel(ReihewennWinkelgeberHigh)-1,1),'Extern_Input_Time_s'}));
%Aufgerundet, Rawdata(vorletzte Reihe, ber der eine Umdrehung abgeschlossen
%wurde, Spalte ExternInputTime)
n=1;
for j=1:1:j_end %j entspricht den Zeiten für eine volle Umdrehung, von 1 bis zur vorletzten Zeit, an der eine volle Umdrehung abgeschlossen wurde
for k=1:1:(numel(RawData)-1) %k zählt durch die table RawData
if(RawData{k,'Time_Ch1_s'}>RawData{ReihewennWinkelgeberHigh(j,1),'Extern_Input_Time_s'}... %Wenn Zeit (Messpunkt) größer als Zeit (voller Umlauf)
&&...
RawData{k,'Time_Ch1_s'}<RawData{ ReihewennWinkelgeberHigh(j+1,1),'Extern_Input_Time_s'}) %Wenn Zeit (Messpunkt) kleiner als Zeit (nächster voller Umlauf)
Normalizedv1(n,1)=RawData{k,'Time_Ch1_s'}-RawData{ReihewennWinkelgeberHigh(j,1),'Extern_Input_Time_s'}; %Ziehe von Messzeit Zeit des letzten vollen Umlaufs ab
Normalizedv1(n,2)=RawData{k,'Velocity_Ch1_mps'};
n=n+1;
end end
Verfasst am: 12.08.2019, 15:48
Titel: Table kostet viel Rechenzeit, auch wenn hübsch
Ich habe jetzt eine ganze Weile herumgepfuscht und festgestellt, dass ich, meines Wissens nach, nur drei Punkte zur Optimierung habe:
-Die Rechnung mit table dauert 64 Sekunden, während die gleiche Rechnung mit einer Matrix 0.015 Sekunden dauert.
-Durch den break Befehl kann die for Schleife sinnvoll beendet werden und muss nicht den ganzen Vektor durchprüfen.
-Die Zeit Spalten müssen streng monoton steigend sein, daher kann die innere for Schleife einen dynamischen Start haben und somit bei der letzten vollen Umdrehung beginnen.
(Was für andere auch nennenswert sein könnte: Eine Matrix die pro Zeile ihre Länge ändert kostet auch ein bisschen Rechenzeit.)
Zu 1.: Bevor ich den dynamischen Start der inneren Schleife hatte, wusste das Programm nicht, wann es im richtigen Zeitfenster ist, da es immer wieder beim 1. angefangen hat zu zählen und dann die erste Bedingung erfüllt war. Erst im richtigen Zeitfenster war auch die zweite erfüllt.
Zu 2.: Das wollte ich mit
Zitat:
Eine Matrix die pro Zeile ihre Länge ändert kostet auch ein bisschen Rechenzeit.
ausdrücken. Der Zeitunterschied lag aber (nach Rechnung mit der Matrix) bei ca 0.01 s.
Hatte den Term nicht mit in das Forum kopiert.
Viele liebe Grüße,
Martin
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.