|
|
Geschwindigkeitsproblem in nem großen Projekt |
|
Moridin |
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 10.04.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.04.2010, 17:26
Titel: Geschwindigkeitsproblem in nem großen Projekt
|
|
|
|
|
Hallo,
erst einmal möchte ich mich gleich vorab entschuldigen falls ich nicht alles Forums-Konform schreibe, aber ich werde mich bemühen!
Zum Verständnis:
Ich schreibe gerade an meiner Abschlussarbeit und arbeite dabei an nem großen Modell, genau sagen was ich mache oder was die Funktion genau macht, oder gar Code-Teile kann ich hier nicht zeigen. Ist halt alles in der Forschung und daher etwas kompliziert...soll ja keiner wissen was genau wer so macht...
Mein Problem:
Also ich muss ein Teil in nem echt großen Simulink-Modell einfügen/bearbeiten. Dabei ist ein kleiner aber wichtiger Teil meiner Aufgabe (ihr seht es ist viel zu tun) dass ich aus mehreren Vektoren Daten finde. Ich versuch das ganze mal zu umschreiben:
Es geht dabei um ein Matching-Problem:
in Vektor A sind Daten aus Quelle A gespeichert, in Vektor B sind andere Daten aus Quelle B gespeichert. Jetzt passt einer dieser Datensätze aus B zu einem aus A (oder auch mehrere), da die Vektoren echt lange werden können und es in einer RealTime Umgebung läuft kann ich das ganze nicht in Simulink selber machen. Ich hab es also in ner Embedded Funktion geschrieben soweit läuft das ganze auch echt gut. Aber egal was ich mache das ganze ist einfach zu langsam.
Ich hab mich mal schon etwas schlauer gemacht und hab jetzt alles definiert was es zu definieren gibt...das Problem scheint zu sein, dass ich einiges an FOR-Schleifen brauche und sobald ich dann die richtigen Einträge gefunden habe geht das rechnen los...dies dauert echt lange und ich kann dies auch nur schwer vereinfachen.
Meine Frage ist jetzt, da ich noch zu wenig mit Embedded-Funktions oder mit direkt eingebundenem C++ in Matlab/Simulink gemacht habe:
Was ist die schnellste Art Funktionen in Matlab ausführen zu lassen?
Wie kann ich schnell viele For- und If Abfragen durchführen bei großen Vektoren?
Ich bedank mich schon mal für eure Hilfe und Anregungen!!!
Gruß Moridin
|
|
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.04.2010, 19:45
Titel:
|
|
evtl. kannst du die Berechnungen mit unterschiedlicher Schrittweite durchführen.
Schau mal in Simulink nach 'triggered subsystem'
Eine in c geschriebene S-Function wird auch zeit sparen
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 10.04.2010, 20:15
Titel:
|
|
Hallo,
kannst du dein Matching-Problem vielleicht an einem kleinen konkreten Beispiel näher erläutern (was hast du / was willst du)? Du brauchst ja nun nicht alles im Detail hier zu posten, aber in dieser Form ist es recht schwierig, dir weiterzuhelfen.
Eine generelle Möglichkeit zur Beschleunigung von Code ist, zu vektorisieren statt z.B. if/for zu verwenden, z.B durch Verwendung von logischer Indizierung (logical indexing).
Eine weitere Möglichkeit liegt in den Solvereinstellungen, evtl. auch Toleranzen verringern.
Grüße,
Harald
|
|
|
Moridin |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 10.04.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.04.2010, 13:36
Titel:
|
|
Hi,
das sind ja schon mal ganz gute Tipps! Danke schon mal!
Das mit der Schrittweite werd ich mal überprüfen!
@Harald
mmh ja dacht ich mir schon, ist halt nur so das ich den Code selber gar nicht hier habe. Aber eigentlich ist es auch nicht so schwer:
Mir ist nicht ganz klar was du mit logischer Indizierung meinst? Kannst du mir das näher Erklähren?
Gruß und danke!!
|
|
|
Epfi |
Forum-Meister
|
|
Beiträge: 1.134
|
|
|
|
Anmeldedatum: 08.01.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.04.2010, 14:04
Titel:
|
|
Moridin hat Folgendes geschrieben: |
|
Das lässt sich mit Sicherheit noch deutlich vereinfachen. Schleifen werden zum Prüfen, ob ein Wert in einem Vektor enthalten ist, nicht benötigt.
Kleines Beispiel:
Man kann auch auf Bedingungen indizieren. Willst Du im Beispieldatensatz alle Zahlen größer als 5 mit NaN ersetzen, sieht das so aus:
Das ist deutlich schneller als for-Schleifen. Verschachtelte for-Schleifen können fast nur langsam werden - vor allem, wenn dort auch noch Vektoren vorkommen, die mit jedem Schleifendurchlauf ihre Länge ändern. Lieber versuchen, die Länge des Vektors vorher zu erfahren und ihn initialisieren:
|
|
|
Moridin |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 10.04.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.04.2010, 14:35
Titel:
|
|
|
|
|
Gute Idee an und für sich, aber ich glaub ich muss den Sachverhalt noch mal näher erklähren:
Es ist so das ich sagen wir mal in Vektor A zwei Zahl habe die ist irgendwas wie 2.546854688 und 52.3565654 sind, diese beiden Zahlen passen jetzt zu Zahlen aus dem anderen Vektor B die sind dann aber sagen wir halt mal 3.654546 und 49.34545 so jetzt sind in Vektor A und B noch Zahlen die ähnlich sind und ich muss versuchen die richtige, also die wirklich passende herrausfinden ein Typisches Matching-Problem.
Daher mache ich das über das Distanzmaß damit kann ich dann noch Abweichungen einrechnen und kann dann eben die passende Kombination finden, sprich das kleinste Maß.
Ich kann auch leider keine Werte aus den Vektoren löschen, da ich diese an andere Stelle wieder brauche, es geht darum den richtigen zu finden und dann zu kombinieren das aus Vektor A noch alle Daten da sind und dann halt aus Vektor B Teile übernommen werden können. Das ganze ist von Haus aus schon recht groß und ich weiß nicht wie ich das besser umschreiben soll...
Wie gesagt bin für alles dankbar.
Was mich am Meisten noch interessiert ist immernoch die frage was ist das schnellste das man unter Maltab/Simulink machen kann? Ist das C++??
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.04.2010, 17:27
Titel:
|
|
Hallo,
die Faustregel ist: gleichwertiger Code ist in C/C++ schneller als in MATLAB, da der Overhead von MATLAB wegfällt. Allerdings ist es in MATLAB leichter, vektorisierten Code zu schreiben, der damit auch schneller als der originale C-Code sein kann.
Ich bin recht zuversichtlich, dass es eine bessere Lösung für dein Problem geben kann, werde aber aus dem Pseudo-Code leider nicht ganz schlau.
Grüße,
Harald
|
|
|
Moridin |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 10.04.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.04.2010, 08:12
Titel:
|
|
|
|
|
@Harald
das hatte ich mir schon gedacht das jetzt so ne Antwort kommt
Ich bin mir nicht wirklich sicher ob man das noch "besser" Programmieren kann mein Betreuer hat da auch schon drauf geschaut und der kann das echt gut! Ich weiß eigentlich auch nicht wie ich das noch besser umschreiben soll...das Problem ist das man den Geschwindigkeitsnachteil schon sehr früh bemerkt. Vielleicht noch zum Bsp als Erklährung vorab, ich habe die Hauptvektoren A und B und zu jedem Vektor habe ich jetzt weitere Vektoren also VektorA_1 und VektorA_2 das die Werte an der Stelle A_1(1) und A_2(1) gehören also zusammen...hoffe das macht es verständlicher...
Und das verstehe ich halt nicht, den eigentlich mache hier bei der Rechnung gar nicht viel, ich such mir Werte aus meinen Vektoren und verarbeite diese mit einfachen Rechenarten. Alles das was Matlab kann...ich dachte erst es liegt daran dass ich noch das obige A Transponiere und dann in ner sqrt brauch aber auch das ist nicht das Problem, es fängt schon viel früher an langsam zu werden.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 12.04.2010, 21:29
Titel:
|
|
Hallo,
vielleicht mal den Profiler verwenden, um der Langsamkeit auf die Spur zu kommen. Wenn du das in einer Embedded MATLAB-Function machst, wird das ganze ja auch in jedem Zeitschritt ausgeführt.
Ist A dann eine 2x2-Matrix? Warum die aufwendige Berechnung von sum(diag(A))?
Was soll mit A weiter gemacht werden?
Was soll denn mit m bzw. n gemacht werden? Das ist doch der springende Punkt. Die Werte könnten auch direkt berechnet werden:
Dann wäre m bzw. n ein Vektor aller m's und n's.
Ohne weitere Informationen kann man leider nicht wirklich helfen.
Grüße,
Harald
|
|
|
Epfi |
Forum-Meister
|
|
Beiträge: 1.134
|
|
|
|
Anmeldedatum: 08.01.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.04.2010, 21:35
Titel:
|
|
Schön, dass nicht nur ich verwundert über diese Zeilen bin. Die vier Zeilen müssten gleichbedeutend mit dieser hier sein:
Damit wäre eine Operation in der Schleife weggespart und Du hast das Ergebnis obendrein auch noch als Vektor, sprich für alle i gleichzeitig. Je mehr Operationen Du vor die Schleife ziehen kannst, desto besser.
|
|
|
Moridin_Gast |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.04.2010, 10:32
Titel: weiter gehts
|
|
Hi,
ja die Zeile ist wohl das Gleiche das stimmt! Ich brauche das damit ich weiß das da auch Werte drin stehen mit denen ich rechnen kann. Kommt erst später...
Aber ich habe glaube ich das Problem gefunden warum das ganze so langsam war, ich habe immer, also auch wenn eine 0 vorhanden ist Rechnungen ausgeführt. Und bei langen Vektoren kostet das echt Zeit. Jetzt hab ich noch ne Hilfsvariable eingefügt und es geht soweit mal.
Bin nur gespannt ob es noch geht wenn ich alle Daten die ich wirklich verarbeiten muss auch eingebaut habe! Ich meld mich dann noch mal!!
Danke für die Hilfen!!!!
Gruß Moridin
|
|
|
LuizAranha |
Forum-Anfänger
|
|
Beiträge: 39
|
|
|
|
Anmeldedatum: 26.03.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.04.2010, 10:38
Titel:
|
|
Hallo Moridin,
Gegenfrage: Warum benötigst du eine Embedded Fcn? Warum transferierst du nicht die Variablen in den Workspace? Wird der Vektor aus einem File generiert und nach Simulink übergeben? Werden die Vektordaten immer wieder neu berechnet oder sind das statische Werte, die je nach Situation benötigt werden?
Im Workspace könntest du auch direkt über ein mexfunction einen in C generierte DLL aufrufen, die dein Vektoren berechnet.
Wie lang ist dein Vektor? Könntest du nicht zahlen sortieren, um dann schneller an die jeweilige Stelle zu springen.
gruss Luiz
|
|
|
Moridin_Gast |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.04.2010, 08:44
Titel:
|
|
Hi,
sorry hatte viel zu tun und bin erst jetzt wieder mal dazugekommen hier reinzuschauen.
Leider geht das ganze nicht so einfach, ich muss das live im Modell rechnen da dies später nicht an nem Arbeitsplatz PC laufen soll. Eher so in nem Fahrzeug...
Naja nach einigen anderen Problemen funktioniert das aber jetzt soweit! Ich versuch halt immer abzufangen wenn nichts gerechnet werden muss...also z.B. wenn ich das Ergebniss 0 bekommen würd...das spart echt viel Zeit!
Danke noch mal für die Hilfen!! Super Forum mir fallen bestimmt bald noch dumme Fragen ein
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|