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

Programmoptimierung

 

DerThomas
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 15.02.2011, 15:46     Titel: Programmoptimierung
  Antworten mit Zitat      
Hallo zusammen,

ich bin ein ziemlicher Anfänger bei Matlab und habe in den letzten Wochen eine recht aufwendige GUI programmiert, die zum einen auf Excel-Tabellen zugreift und eine Dymola-Datei mitverwendet.

Leider ist die GUI mittlerweile so gewachsen, dass der Memory nicht mehr ausreicht.

Da ich ein ziemlicher Anfänger bin, denke ich dass man programmiertechnisch da noch einiges verbessern und schneller machen könnte, leider weiß ich nicht wie Sad

Ich hänge mal mein M-File in den Anhang, in der Hoffnung ihr könnt mir da ein bisschen auf die Sprünge helfen. Auch andere Tipps sind natürlich gern gesehen.

Die Fehlermeldung kommt (nicht immer aber ab und zu) bei der Ausführung meiner GUI:

??? Error using ==> load
Out of memory. Type HELP MEMORY for your options.

Error in ==> tload at 49
eval( [ 'load ' file ] );

Error in ==> dymosim at 183
[s,n] = tload('dsres',quiet);

Error in ==> AuslegungV7>hSimulationCallback at 1663
[simresult,ergnamen] = dymosim([0,1,1e-3,0,1.e-4,8],startwerte,parameter,0);

??? Error while evaluating uicontrol Callback


AuslegungV7.m
 Beschreibung:

Download
 Dateiname:  AuslegungV7.m
 Dateigröße:  117.55 KB
 Heruntergeladen:  363 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.02.2011, 17:31     Titel: Re: Programmoptimierung
  Antworten mit Zitat      
Hallo Thomas,

Zitat:
[color=red]??? Error using ==> load
Out of memory. Type HELP MEMORY for your options.

Error in ==> tload at 49
eval( [ 'load ' file ] );

"eval(['load' file])" ? Meinst Du:
Code:

Du hast zwar den Code für Dein GUI gepostet, aber nicht den relevanten Teil in dem der Fehler auftritt. Die massiv vielen EVALIN-Calls machen es nahezu unmöglich das Programm zu debuggen. Zudem geht EVALIN und EVAL nicht schonend mit den inzternen Variablen-Tabellen um, so dass der Speicher oft unnötig fragmentiert wird. Ein "Out of memory" wird deshalb wahrscheinlicher.
Du kannst ja mal in den 3 bis 4 (hundert?) Beiträgen von mir bzgl dieser beiden Befehle nachlesen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 15.02.2011, 18:08     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich habe eigentlich den kompletten Code meiner GUI gepostet.
Der Fehler tritt beim debuggen immer in folgender Zeile auf:

Code:

[~,ergnamen] = dymosim([0,1,1e-3,0,1.e-4,8],startwerte,parameter,0);
 


dymosim ist ein Befehl um eine Zeit-Simulation eines Dymola-Modells durchzuführen. Und da stößt er scheinbar ab und zu an seine Grenzen.


Momentan verwende ich die "assignin" und "evalin"-Befehle um Daten in und aus dem Workspace zu laden, damit ich sie in anderen Callbackfunctions wiederverwenden kann.

Code:

assignin('base','parameter',parameter);
 


Code:

parameter = evalin('base','parameter');
 


Wie kann ich denn das umgehen? Habe schon einige Beiträge zu setappdata und getappdata gelesen aber die Umsetzung scheitert bei mir leider noch...
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.02.2011, 21:02     Titel:
  Antworten mit Zitat      
Hallo Thomas,

Zitat:
ich habe eigentlich den kompletten Code meiner GUI gepostet.
Der Fehler tritt beim debuggen immer in folgender Zeile auf:
Code:
[~, ergnamen] = dymosim([0,1,1e-3,0,1.e-4,8], startwerte, parameter, 0);
 

Der eigentliche Out-of-memory-Error tritt innerhalb von "dymosim" auf, also wird er auch dort liegen. Das Posten des GUI-Codes ist deshalb nicht hilfreich, weil das Problem (so weit ich sehen kann) gar nicht im GUI-Code liegt.

Wie kamst Du denn auf die Idee ASSIGNIN und EVALIN zum Transport der Variablen zu verwenden? Das ist eigentlich eine sehr ungewöhnliche Methode und ist in den meisten Programmiersprachen gar nicht möglich. Auch im englisch-sprachigen CSSM-Forum wird dies auch von Anfängern kaum benutzt, hier auf goMatlab aber sehr häufig. Passt ASSINGIN und EVALIN irgendwie zur deutschsprachigen Mentalität oder hat ein deutschsprachiger Autor ein Matlab-Buch veröffentlicht, in dem diese verkomplizierende Methode der Variablen-Übergabe propagiert wird? Ich gerate immer heftiger ins Grübeln.

Bei Deinem Problem hilft das aber nun gar nicht weiter. Also Du hast es mit SETAPPDATA und GETAPPDATA versucht, aber ohne Erfolg. Dann poste doch mal, wie Du es versucht hast und welche Fehlermeldungen aufgetreten sind.
Eine ordentliche Methode Variablen zu übergeben ist ein Aufruf einer Unterfunktion des GUI mit Argumenten, die dann die Daten in den UserData oder ApplicationData speichert. GUIDATA wird dazu häufig verwendet.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 16.02.2011, 11:02     Titel:
  Antworten mit Zitat      
Hallo Jan,

auf die Idee mit "evalin" und "assignin" bin ich durch einen Kollegen hier in der Firma gekommen. Er ist auch kein MATLAB-Profi, wusste jedoch dass es irgendwie funktioniert. Wie ich nun erfahren habe, keine sehr elegante Lösung Wink

Hab die 8 "evalin" und "assignin"-Funktionen nun durch "setappdata" und "getappdata" ersetzt. Habe gestern Nacht doch noch herausgefunden wie das funktioniert. Hatte bisher fälschlicherweise immer die handles der Callbackfunktionen angegeben und nicht das handle der figure. Aber nun funktionierts Smile
Sieht nun so aus:

Code:

setappdata(fh,'parameter',parameter);


bzw.

Code:

parameter = getappdata(fh,'parameter');
 


Für mein anderes Problem muss ich mir dann wohl noch etwas einfallen lassen... Evtl. das Dymola-Modell noch überarbeiten.


Aber soweit schon mal meinen Dank! Smile
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.