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

Matlab Code auslagern in MEX Files, aber wie?

 

pattitheonly
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2010, 15:55     Titel: Matlab Code auslagern in MEX Files, aber wie?
  Antworten mit Zitat      
Hallo liebes Forum Smile ,
ich habe eine sehr Zeitkritischen Code. Nun versuche ich zu optimieren.
z.B:
Code:

        laufzeit_str = num2str(round(laufzeit * 200000)/100);
        set(handles.text_laufz_chan1,'String',laufzeit_str);
        guidata(hObject, handles);
   
        axes(handles.plot1_l)
        plot(time,U_AI3,'LineWidth',1);
        title('Digital Echo','FontWeight','bold');
        xlabel('Laufzeit in ms','FontWeight','bold');
        ylabel('Spannung in Volt','FontWeight','bold');
        guidata(hObject, handles); %updates the handles
 


Kann man solche Teile in MEX Files auslagern? würde das schneller gehen?
Die meisten Funktionen sind eh bulid in Funktionen Sad.

Was kann man generell auslagern? Bin für jeden Tipp sehr dankbar Smile


VG,
Patti
Private Nachricht senden Benutzer-Profile anzeigen


InspectorGadget
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 52
Anmeldedatum: 16.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2010, 16:07     Titel:
  Antworten mit Zitat      
Generell kannst Du alles auslagern, was Du in C (oder C++) programmieren kannst. Das Problem dabei ist, dass Du eben viel selber machen musst, das Du in Matlab schon als Funktoin implementiert hast. Die Variablen in C sind nicht so gross, wie in Matlab, wo praktisch jede Variable, egal ob das nur eine einfache Zahl, oder eine 3dim Matrix ist, eine riesen Struktur mit sich schleift. Das hat also einen Vorteil in der Geschwindigkeit.
Nur solltest Du möglichst wenige Aufrufe von MEX-Files verwenden, da das wieder Zeit kostet. AUslagern rentiert sich also, wenn Du einmal ein MEX-File aufrufst, da dann viel und schnell rechnest, und dann fertig bist. Wegen jeder Kleinigkeit ein MEX-File aufzurufen kostet DIch mehr Zeit, als es gleich in Matlab zu machen.
Da Du aber in Deinem Code das Zeug schön plottest, erledigt sich MEX glaub ich. Das ist einfacher in Matlab.

Gruss
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2010, 17:00     Titel:
  Antworten mit Zitat      
Hallo,

ich würde da auch aus der Sicht herangehen, nachzusehen, ob der MATLAB-Code verbessert kann.

Beispiele:
ist guidata(hObject, handles) wirklich nötig? Und das noch 2 Mal?
Wie groß sind die Daten? Sind sie eventuell so groß, dass es die Bildschirmauflösung bei weitem überschreitet? Dann könnte man downsamplen versuchen.

Ansonsten auch mal mit dem Profiler schauen, was eigentlich lange braucht.

Die Zahl der in Embedded MATLAB verfügbaren Funktionen ist im übrigen recht begrenzt und beschränkt sich im Grund auf reine "Rechenroutinen".
http://www.mathworks.com/access/hel.....box/eml/ug/bq1h2z7-9.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
pattitheonly
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2010, 03:31     Titel: Speicheroptimierung & Codebeschleunigung & Axes ausl
  Antworten mit Zitat      
Vielen Dank ersteinmal für Eure Mühe.
Ist es sinnvoll Variablen explizit einen Datentypen zuzuweisen? Wenn ich das mache, optmiert Matlab trotzdem zum Datentyp Double, warum?
Code:

single temp;
temp = (U_Mean /0.01002)-273.15;
 


Bringt mir das überhaupt Vorteile? Was bringt mir Speicherallocation?

Code:

single U_AI0;
U_AI0 = zeros(2000,1);
U_AI0 = [U_AI0_AI1(:,1)];
 


Ein Frage hab ich auch noch zum axes Object.
Momentan mache ich das in einer Whileschleife. Das bedeutet ich führe title,xlabel,ylabel immer wieder aus.
wenn ich das vor die whileschleife bringe, verschwindet title,xlabel,ylabel wenn axes wieder ausgeführt wird.

Code:

axes(handles.plot1_l);
%adds a title, x-axis description, and y-axis description
plot(time,U_AI3,'LineWidth',1);
title('Digital Echo','FontWeight','bold');
xlabel('Laufzeit in ms','FontWeight','bold');
ylabel('Spannung in Volt','FontWeight','bold');
 


Bin für jeden Gedanken dankbar.
Private Nachricht senden Benutzer-Profile anzeigen
 
InspectorGadget
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 52
Anmeldedatum: 16.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2010, 11:36     Titel:
  Antworten mit Zitat      
Wie ich schon geschrieben habe, bildet Matlab zu jeder Variablen eine riesen Struktur. Darin speichert es eine Menge Zusatzinfos. Z.B. Dimensionen, real oder imaginär,.... Und diese Struktur ist immer die gleiche. Ist also völlig egal, ob Du eine Variable als Bool oder als Double deklarierst, die ist praktisch immer gleich gross. Sie unterscheiden sich eigentlich nur in der Menge an "echten Daten", die Du darin abspeicherst. Also ob Du nur eine '3' oder '1 2 3 4 5 6 7 8 9' speicherst.
Speicherallocation brint bei Matlab vorallem was, wenn sich die Grösse einer Variablen dynamisch ändert. Sonst kannst Du Dir das sparen. Ist sogar eher schlecht, weil es eine Anweisung mehr ist. Wenn Du also in einer Schleife Vektoren aneinander hängst, ist Matlab schneller, wenn es vorher die Grösse des resultierenden Vektors/Matrix kennt. Aber darauf macht es Dich selbst aufmerksam!
Private Nachricht senden Benutzer-Profile anzeigen
 
InspectorGadget
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 52
Anmeldedatum: 16.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2010, 11:39     Titel:
  Antworten mit Zitat      
Ach ja, zu axis kann cih nicht viel sagen, aber schreib die label-ANweisung doch nach die while Schleife. Oder ist die Beschriftung schon während dem Ausführen notwendig?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.02.2010, 11:52     Titel:
  Antworten mit Zitat      
Hallo,

Typzuweisung in Matlab funktioniert nicht wie in C/ C++.
single ist eine Matlab Funktion, und
der Aufruf single temp; bewirkt dass single einen Übergabe Parameter bekommt, welcher einen String-Wert temp hat.
Resultat wird an ans geschrieben.
Code:

% Aufruf
single temp;
%
% entspricht den Aufruf
single('temp')
 



es wäre z.B so richtig
Code:

temp = single (1);
% dann sind solche Operationen möglich
temp = temp *1.5
 


Es ist genau wie in C/C++,
Resultat soll dem Typ von zugewiesenen Variable entsprechen.
Bloß in Matlab wird der Typ des Resultats übernommen
in C kommt da zu einem Fehler.
Code:

% wenn U_Mean von Typ double ist,
% dann ist das Ergebnis von Typ double
% deswegen muss sichergestellt sein,
% dass alle Variablen gleichen Typs sind
% sonst muss typecasting betrieben werden
% wenn man Typ beibehalten möchte
temp = single((U_Mean /0.01002)-273.15);
 



Speicherallocation ist besonders sinnvoll, wenn man in einer Schleife die Werte an Array zuweist.
z.B so:
Code:

tic
A=zeros(1,1000);
A(1)=1;
for k=2:1000
A(k)=A(k-1)+k;
end
toc
% Dynamisch erweitern von Array ist zwar auch möglich,
% aber langsamer und Speicher intensiver
tic
B(1)=1;
for k=2:1000
B(k)=B(k-1)+k;
end
toc
 


Wenn man mit Matrizen direkt arbeitet, dann ist die Allocation
nicht nötig. z.B A=B*C,
da Matlab auf Matrixoperationen optimiert worden ist.
Belegt dann automatisch richtig Speicherplatz
Code:

% in diesem Fall ist Speicherallocation nicht nötig
U_AI0 = [U_AI0_AI1(:,1)];
 


Und zu letzter Frage: title, xlabel, ylabel muss mit in die Schleife, weil der plot-Befehl alle Werte resetet.
Private Nachricht senden Benutzer-Profile anzeigen
 
pattitheonly
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2010, 12:07     Titel:
  Antworten mit Zitat      
InspectorGadget hat Folgendes geschrieben:
Ach ja, zu axis kann cih nicht viel sagen, aber schreib die label-ANweisung doch nach die while Schleife. Oder ist die Beschriftung schon während dem Ausführen notwendig?


Mein Aufbau ist in entwa so:
Code:

Initalisierung
while
plotte Messwert
end
 


Mein Programm wäre nur wirklich schnell wenn ich nur den Graphen aktualisieren könnte ohne title, xlabel usw jedesmal zu überschreiben.

Aber ich finde leider keine Möglichkeit...Habe jetzt sogar den Title schon weggelasssen und in der Gui mit static text hingeschummelt...


Vielen Dank für Eure Anregungen,
LG Patti
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.02.2010, 12:41     Titel:
  Antworten mit Zitat      
Hallo

vielleicht sollst du einfach nicht jedes mal plot-Befehl aufrufen, dann wäre xlabel, ylabel und title in der Schleife nicht nötig.
dazu sollst du dir einfach das handle von plot abgreifen und nur Daten darin verändern.
Code:

h= plot(1:10);
xlabel('Mein X-Wert')
ylabel('Mein Y-Wert')
title('Linie')
drawnow

for k=1:10
  set(h, 'XData', round(rand(1,10)*10))
  set(h, 'YData', round(rand(1,10)*10))
pause(0.1);
end


 
Private Nachricht senden Benutzer-Profile anzeigen
 
pattitheonly
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2010, 23:20     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo

vielleicht sollst du einfach nicht jedes mal plot-Befehl aufrufen, dann wäre xlabel, ylabel und title in der Schleife nicht nötig.
dazu sollst du dir einfach das handle von plot abgreifen und nur Daten darin verändern.
Code:

h= plot(1:10);
xlabel('Mein X-Wert')
ylabel('Mein Y-Wert')
title('Linie')
drawnow

for k=1:10
  set(h, 'XData', round(rand(1,10)*10))
  set(h, 'YData', round(rand(1,10)*10))
pause(0.1);
end


 


Genau das was ich gesucht habe, Du bist der Größte!!! Vielen Dank an alle beteiligten!!!!
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 - 2025 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.