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

MAT-Files innerhalb einer Funktion (GUI-Button) laden

 

Trusty

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2014, 11:54     Titel: MAT-Files innerhalb einer Funktion (GUI-Button) laden
  Antworten mit Zitat      
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);

FileName = handles.FileName;
PathName = handles.PathName;
FIDs = handles.FIDs;
FID_Info = handles.FID_Info;

fid = fopen('Eingangsgrößen_Betriebsartenanalyse.txt','r');
Signalliste_mdfimport = textscan(fid, '%s');
status = fclose(fid);

Messung=[PathName, char(FileName(1))];

mdfimport(Messung,'temporaer.mat',Signalliste_mdfimport{:}','resample_0.100000');

load('temporaer.mat');

%    shorten all signals to the shortest vector for i=1 : length(signallist)
   for i=1: length(allsignals)
       oldsize=evalin('caller', ['length(' allsignals{i} ')']);
       assignin('caller', allsignals{i}, ...
           evalin('caller', [allsignals{i} '(1:shortest)'])); %shorten all signals
       disp([allsignals{i} ' shortened from ' int2str(oldsize) ' to ' int2str(shortest) ' (' int2str(shortest-oldsize) ').']);
       clear oldsize;
   end
   clear i;

guidata(hObject, handles);

...

 


Die Fehlermeldung sieht wie folgt aus:

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


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.04.2014, 01:18     Titel: Re: MAT-Files innerhalb einer Funktion (GUI-Button) laden
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Trusty

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2014, 06:32     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 16.04.2014, 13:27     Titel:
  Antworten mit Zitat      
Hat sonst jemand eine Idee?

Oder kann es sein, dass ich mit dieser Frage in der falschen Forumsrubrik angesiedelt bin?

Danke und Gruß
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.04.2014, 17:02     Titel:
  Antworten mit Zitat      
Trusty hat Folgendes geschrieben:
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ß


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?

so:
Code:


data = load('temporaer.mat');

%    shorten all signals to the shortest vector for i=1 : length(signallist)
   for i=1: length(allsignals)
       oldsize= length(data.(allsignals{i}));

      data.(allsignals{i}) =   data.(allsignals{i}) (1:shortest); %shorten all signals
       
disp([allsignals{i} ' shortened from ' int2str(oldsize) ' to ' int2str(shortest) ' (' int2str(shortest-oldsize) ').']);

   end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Trusty

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2014, 10:10     Titel:
  Antworten mit Zitat      
Hallo Dennis,

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

Code:

data = load('temporaer.mat');

%    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) ').']);

clear variable;

   end
 


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?

Vielen Dank und Gruß
 
denny
Supporter

Supporter



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

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

function main()
   a=2
   c= add();
   disp(c)
   function c= add()
      c = a+2;
   end
end

 


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