Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Die nicht zu kurze Kurzeinführung in MATLAB

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Optimierung, Vergleich zweier Zeitskalen und Normierung

 

martin2019
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.08.19
Wohnort: Deutschland
Version: R2018a
     Beitrag Verfasst am: 09.08.2019, 11:59     Titel: Optimierung, Vergleich zweier Zeitskalen und Normierung
  Antworten mit Zitat      
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
   
end
 
 



Über einen Tipp, wie ich das ganze sauberer und schneller lösen könnte würde ich mich sehr freuen.

Liebe Grüße,
Martin
Private Nachricht senden Benutzer-Profile anzeigen


martin2019
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.08.19
Wohnort: Deutschland
Version: R2018a
     Beitrag Verfasst am: 12.08.2019, 16:48     Titel: Table kostet viel Rechenzeit, auch wenn hübsch
  Antworten mit Zitat      
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.)

Liebe Grüße,
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2019, 07:56     Titel:
  Antworten mit Zitat      
Von 64s auf 0.15s ist schon mal ein top Fortschritt. Weitere Punkte die mir aufgefallen sind:

1) Wenn die Daten streng monoton sind, ist dann neben
Code:
(RawData{k,'Time_Ch1_s'}>RawData{ReihewennWinkelgeberHigh(j,1),'Extern_Input_Time_s'}... %Wenn Zeit (Messpunkt) größer als Zeit (voller Umlauf)

auch die Prüfung
Code:
RawData{k,'Time_Ch1_s'}<RawData{ ReihewennWinkelgeberHigh(j+1,1),'Extern_Input_Time_s'})

erforderlich, oder ist der zweite Teil sowieso immer true? Dürfte nur bei exakter Gleichheit relevant werden, ist das hier gewollt?

2) Variablen wie
Code:
Normalizedv1
sollten durch einen Aufruf wie
Code:
Normalizedv1=zeros(numel(RawData)-1*j_end,2)
preallokiert werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
martin2019
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.08.19
Wohnort: Deutschland
Version: R2018a
     Beitrag Verfasst am: 19.08.2019, 10:04     Titel:
  Antworten mit Zitat      
Moin dmjr,

vielen Dank für die Rückmeldung.

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
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.