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

Geschwindigkeitsproblem in nem großen Projekt

 

Moridin
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 10.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2010, 17:26     Titel: Geschwindigkeitsproblem in nem großen Projekt
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2010, 19:45     Titel:
  Antworten mit Zitat      
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

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.04.2010, 20:15     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Moridin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 10.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2010, 13:36     Titel:
  Antworten mit Zitat      
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:

Code:

1. For-Schleife für ersten Datensatz
    1.1. IF-Abfrage "wenn Datenenthalten"
           2. For-Schleife für zweiten Datensatz
               2.1. IF-Abfrage "wenn Datenetnhalten"
                      --> dann Rechnung, hier wird die Mahalanobis-Distanz
                      oder besser der Wert dazu errechnet.
                      end
            end
      end
end

Später folgen dann noch andere Schleifen, die dann die eignetliche Zuordnung machen, spielt aber keine Rolle, da der Rest auskommentier ist.


Mir ist nicht ganz klar was du mit logischer Indizierung meinst? Kannst du mir das näher Erklähren?

Gruß und danke!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2010, 14:04     Titel:
  Antworten mit Zitat      
Moridin hat Folgendes geschrieben:

Code:

1. For-Schleife für ersten Datensatz
    1.1. IF-Abfrage "wenn Datenenthalten"
           2. For-Schleife für zweiten Datensatz
               2.1. IF-Abfrage "wenn Datenetnhalten"
                      --> dann Rechnung, hier wird die Mahalanobis-Distanz
                      oder besser der Wert dazu errechnet.
                      end
            end
      end
end
 



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:
Code:

daten = [1, 2, 3, 4, 5, 5, 7, 8, 9]

if sum(daten==5)
   disp('5 ist enthalten'); %wird ausgegeben
end

if sum(daten==6)
   disp('6 ist enthalten'); %wird nicht ausgegeben
end
 


Man kann auch auf Bedingungen indizieren. Willst Du im Beispieldatensatz alle Zahlen größer als 5 mit NaN ersetzen, sieht das so aus:
Code:

daten(daten>5) = NaN;
 

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:
Code:
laenge = kluger_befehl_um_laenge_zu_erfahren();
ergebnisvektor = zeros(laenge, 1);
Private Nachricht senden Benutzer-Profile anzeigen
 
Moridin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 10.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2010, 14:35     Titel:
  Antworten mit Zitat      
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++??
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.04.2010, 17:27     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Moridin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 10.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2010, 08:12     Titel:
  Antworten mit Zitat      
@Harald

das hatte ich mir schon gedacht das jetzt so ne Antwort kommt Smile

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

Code:

for i=1:1:length(VektorA_1)

A = [Abweichung(i), 0; 0, Abweichung(i)];
sum_A = sum(diag(A));
% scheint noch zu laufen


 for b=1:1:length(VektorB_1)
 % Sobald ich jetzt hier eine Rechnung mache bekomme ich Probleme,
 % generell suche ich mir halt aus Vektoren jetzt Werte herraus z.B:

 m = Wert_VektorA_2(i) - Wert_VektorB_2(b);
 n  = Wert_VektorA_3(i) - Wert_VektorB_3(b);

 end
end
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.04.2010, 21:29     Titel:
  Antworten mit Zitat      
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.

Code:
A = [Abweichung(i), 0; 0, Abweichung(i)];

Ist A dann eine 2x2-Matrix? Warum die aufwendige Berechnung von sum(diag(A))?
Was soll mit A weiter gemacht werden?

Code:
for b=1:1:length(VektorB_1)
 % Sobald ich jetzt hier eine Rechnung mache bekomme ich Probleme,
 % generell suche ich mir halt aus Vektoren jetzt Werte herraus z.B:

 m = Wert_VektorA_2(i) - Wert_VektorB_2(b);
 n  = Wert_VektorA_3(i) - Wert_VektorB_3(b);

 end


Was soll denn mit m bzw. n gemacht werden? Das ist doch der springende Punkt. Die Werte könnten auch direkt berechnet werden:
Code:
m =  Wert_VektorA_2(i) - Wert_VektorB_2;
n  = Wert_VektorA_3(i) - Wert_VektorB_3;


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2010, 21:35     Titel:
  Antworten mit Zitat      
Code:

for i=1:1:length(VektorA_1)
    A = [Abweichung(i), 0; 0, Abweichung(i)];
    sum_A = sum(diag(A));
end
 


Schön, dass nicht nur ich verwundert über diese Zeilen bin. Die vier Zeilen müssten gleichbedeutend mit dieser hier sein:
Code:

sum_A = 2*Abweichung;
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Moridin_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 10:32     Titel: weiter gehts
  Antworten mit Zitat      
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

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 26.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 10:38     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Moridin_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2010, 08:44     Titel:
  Antworten mit Zitat      
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 Smile
 
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.