Ich schaue also immer nach dem nächsten Zeitstempel, "rechne" diesen in einen Sample um und weise dann allen Werten im Array von t.start bis t.end den gleichen Wert zu.
Da in einem Kanal ca. 150000 Samples sind dauert es ca. 4 Sekunden pro Kanal bis er berechnet ist.
Hat jemand eine Idee wie man den Code performanter gestalten kann?
was spricht gegen die Verwendung von INTERP1?
Im übrigen ist von der systematischen Anwendung von EVAL dringend abzuraten, da es den Code äußerst unübersichtlich macht.
Interp1 ist für mich nicht ganz das richtige - ich kann keine interpolierten Daten gebrauchen für die Art von Auswertung die ich mache. Ich will dass so lange der letzte gültige Wert eingetragen wird bis der nächste "echte" Wert kommt.
Das mit dem Eval benutze ich deswegen weil ich über die GUI dynamisch Kanalnamen zuweise. Allerdings habe ich über das "profile" tool auch schon herausbekommen dass es das eval ist, welches mich am meisten ausbremst.
Daher bin ich jetzt zu folgendem Ergebniss bekommen (nachdem ich mich mit dem "how to vectorize my code" beschäftigt habe):
Ich weise also erst - per eval - die Originaldaten des Channels einer Dummystruktur zu - erstelle dann eine DummyOutStruktur - und weise diese dann zum Schluss - wieder per eval - meiner später zu verwendenden Kanalliste zu...
...ach ja - so ist der Code ca. um das 10fache schneller und somit gut für meine Zwecke zu gebrauchen...
Das Arbeiten mit STRUCT-Feldern ist langsamer als die Benutzung von elementaren Variablen. Ich würde deshalb sehr empfehlen "t_start" statt "t.start" zu verwenden.
EVAL ist überflüssig:
Leider verstehe ich auch nach längerem Lesen nicht, was das Program leisten soll. Ich habe trotzdem den Eindruck, es könnte deutlich einfacher und schneller gehen. Vielleicht so:
Code:
n = data_original.time(end) * 1000;
Index = zeros(1, n);
Index(floor(data_original.time * 1000)) = 1;
Index(1) = 1;
Index = cumsum(Index);
data.(channel{i,1}) = data_original.value(Index);
danke für Deine Antwort. Das mit den elementaren Variablen werde ich gleich mal ausprobieren, ebenso wie das umgehen des eval Befehls.
Zur Aufgabe meines Codes:
Die verschiedenen Kanäle liegen in unterschiedlichen Samperaten vor. Es sind Kanäle dabei die z.B. permanent in 10ms Samples vorhanden sind. Es gibt aber auch welche mit getriggerter Aufzeichnungsrate, d.h. normal 200ms - wenn Triggerereigniss dann bis Trigger2 in 1ms Samplerate. Das heisst innerhalb eines Channels ist delta t zwischen zwei Samples nicht immer gleich.
Und weil es für die Auswertung bestimmter Ereignisse notwendig ist Kanäle mit verschiedenen Sampleraten zu verknüpfen setze ich alle nötigen Kanäle auf die gleiche Zeitbasis.
Gruß,
Holger
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.