MAT-Files innerhalb einer Funktion (GUI-Button) laden
Trusty
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.04.2014, 11:54
Titel: MAT-Files innerhalb einer Funktion (GUI-Button) laden
Hallo Zusammen,
ich hab leider nichts zu meinem Problem finden können, daher hoffe ich, dass Ihr mir weiterhelfen könnt! Ich mache gerade meine ersten Schritte in Sachen GUI und somit Funktionen in Matlab. Mein Ziel ist es, ein bestehendes Skript (Einlesen einer .dat-Datei und Auswertung von Zeitanteilen), welches funktionstüchtig ist, mit Hilfe einer grafisches Oberfläche für Kollegen anschaulicher zu machen.
Mein Problem ist nun folgendes, dass ich mit mdfimport die .dat-Datei laden will. Nun hab ich schon rausgefunden, dass mdfimport innerhalb einer function nicht ohne weiteres funktioniert, da die Variablen immer in den base-Workspace geladen werden. Als Workaround schreibe ich nun die gewünschte dat-Datei in ein Matfile und lade es anschließend mit load. Nachfolgend möchte ich alle Signale auf die Länge des kürzesten Vektors kürzen, doch da kommt die Meldung dass entsprechende Variablen nicht auffindbar sind. Ich bin mir eigentlich sicher, dass mein Problem durch die verschiedenen Workspaces entsteht! Nutze ich dann einen Breakpoint an der besagten Fehlerzeile, so sieht man ja temporär den seperaten "Function-Workspace". Doch die Variablen, die angeblich nicht auffindbar sind, kann ich darin sehen. Und genau an dieser Stelle enden meine Ideen wie ich das Problem lösen könnte...
Anbei der Code:
Code:
function start_Callback(hObject, eventdata, handles) % hObject handle to start (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles = guidata(gcbo);
??? Error using ==> evalin
Undefined function or variable 'time'.
Error in ==> Betriebsartenanalyse_GUI>start_Callback at 210
oldsize=evalin('caller', ['length(' allsignals{i} ')']);
Error in ==> gui_mainfcn at 96
feval(varargin{:});
Error in ==> Betriebsartenanalyse_GUI at 42
gui_mainfcn(gui_State, varargin{:});
Error in ==> @(hObject,eventdata)Betriebsartenanalyse_GUI('start_Callback',hObject,eventdata,guidata(hObject))
??? Error while evaluating uicontrol Callback
Die Variable "time", welche an der ersten Position des Cell-Arrays "allsignals" steht, ist also nicht auffindbar. Wie gesagt, wenn ich einen Breakpoint an die besagte Stelle setze, dann sehe ich ja den "Function-Workspace" und die darin enthaltene Variable "time". Vll hab ich auch den Befehl evalin nicht richtig verstanden und wende ihn hier innerhalb einer function falsch an...?!
Hoffe mein Problem verständlich dargestellt zu haben, sodass ihr mir weiterhelfen könnt! Vorab vielen Dank für eure Bemühungen...
Verfasst am: 16.04.2014, 01:18
Titel: Re: MAT-Files innerhalb einer Funktion (GUI-Button) laden
Hallo Trusty,
EVALIN('Caller', ...) berechnet den Ausdruck im WorkSpace des Callers, also der aufrufenden Funktion. In welchem Workspace ist "time" als Variable vorhanden?
Gruß, Jan
Trusty
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.04.2014, 06:32
Titel:
Hallo Jan,
die Variable "time" ist wie gewünscht nicht im base-Workspace vorhanden. Wenn ich zum Debugging einen Breakpoint an die Zeile mit dem evalin Ausdruck setze, dann seh ich alle Variablen aus dem MAT-File "temporaer.mat" und somit auch "time". Dies müsste doch der Workspace der Funktion "function start_Callback(hObject, eventdata, handles)" sein, oder versteh ich da was falsch? Oder kuckt er bei Caller nochmal ne Ebene höher? Wenn ichs richtig verstehe, habe ich bei einem Funktionsausdruck auch nur eine Ebene und somit einen Function-Workspace...
Danke und Gruß
Trusty
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.04.2014, 13:27
Titel:
Hat sonst jemand eine Idee?
Oder kann es sein, dass ich mit dieser Frage in der falschen Forumsrubrik angesiedelt bin?
die Variable "time" ist wie gewünscht nicht im base-Workspace vorhanden. Wenn ich zum Debugging einen Breakpoint an die Zeile mit dem evalin Ausdruck setze, dann seh ich alle Variablen aus dem MAT-File "temporaer.mat" und somit auch "time". Dies müsste doch der Workspace der Funktion "function start_Callback(hObject, eventdata, handles)" sein, oder versteh ich da was falsch? Oder kuckt er bei Caller nochmal ne Ebene höher? Wenn ichs richtig verstehe, habe ich bei einem Funktionsausdruck auch nur eine Ebene und somit einen Function-Workspace...
Danke und Gruß
Caller ist der Workspace der Funktion, welche die Funktion start_Callback(hObject, eventdata, handles) aufruft. Bei GUIDE erstellten GUIs für Callback ist das die Hauptfunktion(also die erste Funktion in M-File).
Vielleicht wäre hier besser Struktur mit dynamischen Feldern zu verwenden
Woher kommt denn allsignals-Variable und shortest?
"allsignals" und "shortest" sind antworten von mdfimport, welche neben den einzulesenden Variablen aus dem DAT-File in den Workspace bzw. in das Mat-File geschrieben werden.
Mit kleinen Abänderungen konnte ich deinen Code-Vorschlag nun erfolgreich verwerden:
% shorten all signals to the shortest vector for i=1 : length(signallist) for i=1: length(data.allsignals)
variable =data.allsignals{i};
oldsize= length(data.(variable));
data.(variable) = data.(variable)(1:data.shortest); %shorten all signals
disp([variable ' shortened from ' int2str(oldsize) ' to ' int2str(data.shortest) '(' int2str(data.shortest-oldsize) ').']);
Funktioniert, hat für mich aber den Nachteil, dass ich alle Varialbennamen im nachfolgenden Skript ändern muss.
Du hast mich aber mit der Anmerkung, dass hier eine Haupt- und eine Unterfunktion vorliegt auf die Idee gebracht, dass man die Variablen den einzelnen Workspaces gegenseitig zur Verfügung stellen/übergeben muss.
Kann mir jemand sagen, wie man diese Variablen übergibt?
Funktioniert, hat für mich aber den Nachteil, dass ich alle Varialbennamen im nachfolgenden Skript ändern muss.
EVALIN/EVAL sind, wie Klotz am Bein, man kriegt irgend wo immer ein Problem. Sei es Bei Debuggen oder Verwalten
Deswegen ist eine Gute-Datenstruktur zu empfehlen
Zitat:
Du hast mich aber mit der Anmerkung, dass hier eine Haupt- und eine Unterfunktion vorliegt auf die Idee gebracht, dass man die Variablen den einzelnen Workspaces gegenseitig zur Verfügung stellen/übergeben muss.
Kann mir jemand sagen, wie man diese Variablen übergibt?
Das habe ich oben unglücklich ausgedrückt, dass sind keine Unterfunktionen, weil die Unterfunktionen haben ja Zugriff auf Workspace der Hauptfunktion
hier Beispiel mit der Unterfunktion
Über GUIDE erstellte GUI sind alle Funktion auf gleichen Level und haben eigenen Workpace. Übergaben zwischen den Funktion ist am besten über SETAPPDATA/GETAPPDATA zu bewerkstelligen
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.