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

Browser nutzen, um .mat-file in GUI zu laden

 

RoterFasan
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2018, 20:25     Titel: Browser nutzen, um .mat-file in GUI zu laden
  Antworten mit Zitat      
Guten Abend miteinander,

ich möchte ein GUI erstellen, mit welchem ein .mat-file geöffnet werden kann, welches Messwerte enthält, die danach in einem Plot angezeigt werden sollen.
Die files entstammen enthalten Messdaten aus einem Versuch in Form mehrerer eintzelner structs. Ein Bild von Dem GUI habe ich angehängt.
Mein Code sieht folgendermaßen aus:
Code:
function varargout = auswertungtestgui(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @auswertungtestgui_OpeningFcn, ...
                   'gui_OutputFcn',  @auswertungtestgui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function auswertungtestgui_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;


guidata(hObject, handles);




function varargout = auswertungtestgui_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;



function pushbutton1_Callback(hObject, eventdata, handles)







function suchbutton_Callback(hObject, eventdata, handles)

[filename pathname] = uigetfile({'*.mat'}, 'File Selector');
fullpathname = strcat(pathname, filename);
text = fileread(fullpathname);
set(handles.text1, 'String', fullpathname);
set(handles.text2, 'String', filename);

load(filename);

pfad = fullpathname
set(handles.Filename, 'String', [filename '-mat']);
[filepath,name,ext] = fileparts(pfad)
set(handles.text3, 'String', name);
dateiext = name
set(handles.datei, 'String', [dateiext '.mat']);
v = dateiext;
vx = '.X';
varext = [v,vx];
varextzus = '.Data';
varextdata = [varext,varextzus];
x = varextdata;

vy = '.Y';
messreihe = '(1)';
messdata = '.Data'
messdaten = [v,vy,messreihe,messdata];
y = messdaten;

set(handles.test, 'String', messdaten);

set(handles.diagnose, 'String', filename);

plot(varexdatatext,messdatentext);




function button_Callback(hObject, eventdata, handles)


Mein Plan war es, über das GUI bzw. den Browser das .mat-file auszuwählen, und über die Variable, die den Dateinamen enthält, die Datei in den Workspace zu laden.
Code:

Leider funktioniert dies nicht. Ändert man den Code jedoch, sodass statt load (filename) folgender Code verwendet wird läuft es.
Code:
load('Messdaten.mat');
x = Messdaten.X.Data;
y = Messdaten.Y.Data;
plot(x,y);

Mein Problem ist, dass ich nicht weiß, wie ich mit dem load-Befehl verfahren soll. Die Regeln für load habe ich bereits in der MATLAB-Hilfe nachgeschaut. MATLAB erwartet unter anderem die im zweiten Codeblock genutzte Form des load-Befehls. In meinem Fall würden jedoch keine amerikanischen Anführungszeichen in load() stehen, da diese in der Variable filename nicht enthalten sind. der folgende Code führt auch nicht zum gewünschen Ergebnis, da sich dieser auf eine Datei bezieht:
Code:


Da ich noch ein Neuling im Umgang mit MATLAB bin, habe schon den ganzen Nachmittag nach einer Lösung gesucht und konnte keine brauchbare Lösung finden. Auch gehen mir langsam die Möglichkeiten aus, wo ich Informationen einholen könnte. Ich würde mich sehr freuen, wenn Ihr mir helfen könnt.

Viele Grüße,
RoterFasan

MATLAB_GUI.JPG
 Beschreibung:

Download
 Dateiname:  MATLAB_GUI.JPG
 Dateigröße:  110.69 KB
 Heruntergeladen:  385 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.03.2018, 08:55     Titel:
  Antworten mit Zitat      
Hallo,

was funktioniert daran nicht? Bekommst du eine Fehlermeldung? Welche?

Generell ist auch das zu beachten:
https://de.mathworks.com/help/matla.....data-among-callbacks.html

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.03.2018, 14:17     Titel:
  Antworten mit Zitat      
Hallo Harald,

die Fehlermeldung ist folgende:
Code:
Undefined function or variable 'varexdatatext'.

Error in auswertungtestgui>suchbutton_Callback (line 77)
plot(varexdatatext,messdatentext);

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in auswertungtestgui (line 17)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)auswertungtestgui('suchbutton_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback.
 


Kann es sein, dass der Fehler darin liegt, dass die Datei nicht geladen werden kann, da in der Variable filename der Name der Datei nicht in Anführungszeichen steht?
Ich habe ja versucht den Code so aufzubauen, dass der Name der Datei eingelesen wird und dann über den load-Befehl geöffnet wird, jedoch erfordert der Befehl den Namen der Datei in Anführungszeichen.
Oder könnte der Fehler beim plot Befehl liegen? Wenn ich diesen Befehl entferne, dann läuft alles ohne Fehler, aber liefert auch kein Ergebnis.

Viele Grüße,
RoterFasan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.03.2018, 15:03     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Variable varexdatatext in der ausgewählten .mat-Datei existiert, sollte das klappen.

Die Alternative mit 'messdaten.txt' ändert ja nicht nur den Dateinamen, sondern setzt auch eine ganze Datenstruktur voraus.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.03.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2018, 11:54     Titel:
  Antworten mit Zitat      
Hallo,

ich habe ein paar Bilder von der Struktur der Messdaten angehängt. Wollte man einen plot einer bestimmten Größe in Y über X ausgeben lassen, würde man den folgenden Code nutzen:
Code:
load('Firma_Datum_001.mat');
x = Firma_Datum_Messreihe.X.Data;
y = Firma_Datum_Messreihe.Y(1).Data;
plot(x,y);


Damit funktioniert es fehlerfrei. Das Problem ist aber, dass ich ein GUI erstellen möchte, welches entweder mehrere Diagramme erstellt oder verschiedene Messdaten in einem Diagramm darstellt. Im folgenden Code werde ich kurz anmerken, was ich mit den jeweiligen Befehlen erreichen wollte.
Code:
function suchbutton_Callback(hObject, eventdata, handles)

[filename pathname] = uigetfile({'*.mat'}, 'File Selector');
fullpathname = strcat(pathname, filename);
text = fileread(fullpathname);
% in den beiden Textfeldern sollen der Pfas und der Dateiname angezeigt werden
set(handles.text1, 'String', fullpathname);
set(handles.text2, 'String', filename);
% mit dem folgenden Befehl soll die vorher über den Browser ausgewählte Datei in den Workspace geladen werden
load(filename);

% im Folgenden wird der Dateipfasd zerlegt, dies ist im weiteren Verlauf sehr wichtig
[filepath,name,ext] = fileparts(fullpathname)
% Darstellung in den Textfeldern text3 und datei zur Kontrolle
set(handles.text3, 'String', name);
set(handles.datei, 'String', [name '.mat']);
% Nun soll beschrieben werden, welche Daten innerhalb des .mat-files auszuwählen sind
% für die X-Komponente des späteren plots werden die Daten im file benötigt,
% die sich unter Firma_Datum_Messreihe.X.Data befinden. Es soll also
% genau dieser "Pfad" erstellt werden und später in der Variable varexdata
% gespeichert werden.

v = name
vx = '.X';
varext = [v,vx];
varextzus = '.Data';
varextdata = [varext,varextzus];
x = varextdata;

% Die Erstellung des Pfades für die Messwerte bzw.Y-Werte wird auf gleiche
% Weise wie der der X-Werte erstellt. Für die Messwerte ist jedoch noch die
% Information wichtig, welche Reihe unter Firma_Datum_Messreihe.Y von
% Interesse ist. Dies wird durch die Variable messreihe erreicht.

vy = '.Y';
messreihe = '(1)';
messdata = '.Data'
messdaten = [v,vy,messreihe,messdata];
y = messdaten;

% Das Vorgehen funktioniert sowohl für die X- als auch für die Y-Komponente.
% Dies habe ich durch Darstellung der einzelnen Variablen im Textfeld test
% feststellen können.
set(handles.test, 'String', messdaten);

% set(handles.diagnose, 'String', fullpathname);

plot(varexdata,messdaten);


Viele Grüße,
RoterFasan

matfile_geoeffnet.JPG
 Beschreibung:

Download
 Dateiname:  matfile_geoeffnet.JPG
 Dateigröße:  39.29 KB
 Heruntergeladen:  326 mal
X_Komponenten.JPG
 Beschreibung:

Download
 Dateiname:  X_Komponenten.JPG
 Dateigröße:  30.95 KB
 Heruntergeladen:  342 mal
vollstaendiger_Pfand_fuer_X_Komponente.JPG
 Beschreibung:

Download
 Dateiname:  vollstaendiger_Pfand_fuer_X_Komponente.JPG
 Dateigröße:  44.74 KB
 Heruntergeladen:  315 mal
Y_Komponenten.JPG
 Beschreibung:

Download
 Dateiname:  Y_Komponenten.JPG
 Dateigröße:  32 KB
 Heruntergeladen:  333 mal
vollstaendiger_Pfand_fuer_Y_Komponente.JPG
 Beschreibung:

Download
 Dateiname:  vollstaendiger_Pfand_fuer_Y_Komponente.JPG
 Dateigröße:  38.52 KB
 Heruntergeladen:  334 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.03.2018, 22:46     Titel:
  Antworten mit Zitat      
Hallo,

bitte auf die Antwort eingehen. Als erstes solltest du mal den Tippfehler beheben, auf den dich die Fehlermeldung hinweist (varextdata statt varexdata).

Du musst schon zwischen Zeichenketten (alles in ' ') und Variablen (das, was du plotten willst) unterscheiden.
Du kannst entweder eval nutzen, um die zusammengestückelten Strings auszuwerten. Würde ich aber nicht empfehlen, weil es schwierig zu debuggen ist. Besser wäre dynamische Indizierung, z.B. statt data.X
Code:
fld = 'X';
data.(fld)


Grüße,
Harald
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.