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

Plotten parallel zu Code-Ausführung

 

ueg
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2022, 13:04     Titel: Plotten parallel zu Code-Ausführung
  Antworten mit Zitat      
Hallo zusammen,

ich werte momentan Versuche mit einem Spektrometer mit Matlab aus.
Dafür lade ich alle 0.5 Sekunden die Daten vom Spektrometer, verarbeite diese in einer FFT und alle 20 Durchgänge werden die Daten geplottet.
Das Prinzip ist stark vereinfacht folgendes:

Code:

figure()
n = 1;
running = 1;
while running
    tic
    get_data_from_spectrometer
    process_data
    data_collected(n) = processed data
    if rem(n,20) == 0
        hold on
        surf(plot data_collected(end-20:end,:)
    end
    pause(0.5-toc) %Jeder Vorgang soll genau 0.5s dauern
end
 


Das funktioniert soweit hervorragend, nur ist es wichtig, dass alle Messungen genau gleich lange dauern, bzw. dass in konstanten Zeitschritten "get_data" ausgeführt wird.
Solange nicht geplottet wird, funktioniert das auch hervorragend. Der Code an sich dauert um die 0.1s um ausgeführt zu werden. Und dann wird am Ende eben gewartet bis 0.5s rum sind und der Code wird wieder ausgeführt.
Nur das Plotten dauert zu lange, sodass jeder 20. Schritt länger als 0.5s dauert.

Gibt es eine Möglichkeit parallel zur weiteren Code-Ausführung zu plotten? Also, dass Matlab mit der weiteren Code-Ausführung nicht wartet, bis fertig geplottet wurde und direkt parallel zum Plot-Aktualisieren weiter rechnet?
Ich hoffe, das Problem ist verständlich.

Viele Grüße
Tim
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2022, 14:39     Titel:
  Antworten mit Zitat      
Hallo,

es gibt in der Parallel Computing Toolbox schon entsprechende Konstrukte, z.B. spmd. Meine Empfehlung wäre aber eher, mit Timern zu arbeiten.
Hinsichtlich Performance sollte man das "hold on" vor die Schleife ziehen. Zudem kann es helfen, nur die Daten im surf-Plot zu aktualisieren statt die Graphik neu zu generieren.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ueg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2022, 15:43     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe.
Ich habe mich jetzt übergangsweise mal damit begnügt, die Messungen nach dem Plotten weniger lang warten zu lassen, bis die gesamte Dauer wieder stimmt.
So, dass die 1. Messung bei 0.5s, die 10. nach 5s usw. beendet ist und nicht mehr, dass jede einzelne Messung genau 0,5s dauert.

Das hold on habe ich auch vor die Schleife gezogen und anstatt surf habe ich surface verwendet, das plottet bei mir schneller.

Falls das doch nicht ausreichen sollte an Genauigkeit, schaue ich mir das mit der Parallelisierung noch einmal an. Auf die Schnelle habe ich das nicht hinbekommen..

Viele Grüße
Tim

Edit: Das Ganze wurde noch deutlich verschnellert, indem ich vor der Schleife die ganze Figure eingerichtet und das surf-Element erzeugt habe und später wie du vorgeschlagen hast nur noch zu Aktualisieren.

Code:

figure('WindowState', 'maximized')
        Running_Plot = surface([]);
        view(0,90)
        xlim([3 20])
        caxis([0.4 1])
        colormap jet
        xlabel("Durchmesser in µm")
        ylabel("Messpunkte")
        title("gemessene Kapillardurchmesser mit WGM, lambda_l_o_w = "+lambda_low+ "nm, lambda_u_p = "+lambda_up+"nm")
        set(gca, 'FontSize', 14)
        hold on
 

in der Schleife steht dann nur noch
Code:

set(Running_Plot, 'XData', x, 'YData', y, 'ZData', z, 'CData', z);
drawnow
 

Falls noch jemand drüber stolpert: Ich hatte eine Weile einen Fehler, dass CData nicht passt. Das Problem gibt's nicht mehr seit ich CData und ZData beiden die "Höhenwerte" zugewiesen habe. Warum das so sein muss, habe ich mir allerdings nicht angeschaut..
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 - 2024 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.