Verfasst am: 09.02.2015, 22:50
Titel: Einzelne vektoren aus .mat Datei in GUI einfügen
Hallo Leute,
ich habe nun angefangen mit GUIs anzufangen und habe in den letzten Tagen ein bisschen zu diesem Thema gelesen. Leider finde ich nie genau das was ich benötige, deshalb wollte ich diesen Thread aufmachen.
Also was ich möchte ist, dass ich durch das GUI eine .mat Datei auswähle und daraus dann verschiedene Vektoren zur Auswertung auswählen kann (um zum Beispiel ein Diagramm oder den Mittelwert zu errechnen).
Was ich bisher habe ist folgender Code.
Code:
handles.a = uiimport; % Einlesen von Messdaten und in a speichern
Allerdings passiert damit nicht so das was ich möchte.
Damit kann ich eine Datei auswählen und aus der Datei einen Vektor auswählen.
Ich würde jedoch mehrere Vektoren auswählen und diese auch im GUI ausgeben.
Gibt es die Möglichkeit die geladenen Variablen im GUI anzeigen zu lassen und unter diesen Variablen welche auszuwählen, die man weiter bearbeiten möchte, beziwhungsweise in einem Diagramm darstellen möchte?
Gibt es die Möglichkeit die geladenen Variablen im GUI anzeigen zu lassen und unter diesen Variablen welche auszuwählen, die man weiter bearbeiten möchte, beziwhungsweise in einem Diagramm darstellen möchte?
Bin für jede Hilfe dankbar.
Grüße
Hallo anleger92,
ich habe das gleiche vor einigen Monaten gemacht. Jedoch war das mit einer GUIDE GUI. Nachdem die mat Datei geladen wurde, durchsucht mein Programm den Inhalt der geladenen Struktur.
Hierbei wird davon ausgegangen, dass der Inhalt dieser Struktur unbekannt ist.
Hierbei darfst du nicht vergessen, dass die GUIDE GUI eine eigene workspace hat. Diese kann man nur in der Matlab workspace sehen, wenn man es in der GUI ausdrücklich definiert.
Das geht so:
Mein Code sucht dann nach variablen des Typs 'Timeseries' und schreibt den Namen der Variablen in ein bereits vorhandenes 'checkbox'- Element dar.
Das geschieht mit jeder gefundenen 'Timeseries' Variable.
Hierbei wird auch untersucht, ob weitere Strukturen innerhalb der ersten vorhanden sind und für den Fall das dies geschieht geht mein Code in die gefundene Struktur und such weiter.
Um dies zu realisieren habe ich im Vorfeld bereits 40 unsichtbare checkboxen erstellt und jedem einen Namen 'cb+Indexnummer' zugeteilt.
Nachdem die Variablen nun geladen wurden habe ich eine Plot Funktion implementiert, mit der ich die Möglichkeit hatte jede, in der checkbox ausgewählte variable zu plotten.
Der Code ist sehr umständlich geschrieben und ich könnte ihn auch durch eine wiederholten Aufruf einer Funktion vereinfachen, jedoch ist es mit damals nicht eingefallen und ich hatte auch die Zeit dafür nicht mehr.
Hier mein Code zum durchsuchen der bereits geladenen Struktur:
simOut ist der Name der geladenen Struktur.
Plotdata sind die Variablen, welche später geplottet werden.
SimDataName ist wie der Name schon sagt die Bezeichnung des Simulationsnamen, aus dem die Datei stammt. Es ist dafür da um mehrere Simulationsdaten zu laden.
Code:
% This function is made for all kind of simulation data as long as the data % is saved inside a file named 'simOut.mat'.
%
% The loops are seachring for structs, values and timeseries arrays.
%
% When a timeseries value is found, it will be saved inside the 'PlotData' % struct and the function 'EditCbText' is opened. % When a value is found, it will be saved inside the 'TableData' struct. % And when a struct is found starts the code again looking for more structs % or the specified types of variables.
%
% See also EditCbText
%% script to search for all the variables in the loaded sim data struct
% couter for the Tag Name/Number of the variable checkbox
cbNr = 1;
% if simOut is a struct, we have to look if it contains more structs or arrays if(isstruct(simOut)) % get the names of the 'unknown' variables and save them to be able to get access to the data
fnA = fieldnames(simOut);
for A=1:numel(fnA)
varA = char(fnA(A)); % inside var are the saved structures: calc, bldc, bldc_ar, clock % determine if the selected variable is a struct if(isstruct(simOut.(varA)))
fnB = fieldnames(simOut.(varA));
for B=1:numel(fnB)
varB = char(fnB(B));
if(isstruct(simOut.(varA).(varB)))
fnC = fieldnames(simOut.(varA).(varB));
for C=1:numel(fnC)
varC = char(fnC(C));
if(isstruct(simOut.(varA).(varB).(varC)))
fnD = fieldnames(simOut.(varA).(varB).(varC));
for D=1:numel(fnD)
varD = char(fnD(D));
if(isstruct(simOut.(varA).(varB).(varC).(varD)))
fnE = fieldnames(simOut.(varA).(varB).(varC).(varD));
for E=1:numel(fnE)
varE = char(fnE(E));
if(isstruct(simOut.(varA).(varB).(varC).(varD).(varF)))
fnF = fieldnames(simOut.(varA).(varB).(varC).(varD).(varE));
for F=1:numel(fnF)
varF = char(fnF(F));
if(isa((simOut.(varA).(varB).(varC).(varD).(varE).(varF)),'timeseries'))
PlotData.(SimDataName).(varE) = simOut.(varA).(varB).(varC).(varD).(varE).(varF);
loadedVarName = varF;
EditCbText
end;
end;% end for F else if(isa((simOut.(varA).(varB).(varC).(varD).(varE)),'timeseries'))
PlotData.(SimDataName).(varD) = simOut.(varA).(varB).(varC).(varD).(varE);
loadedVarName = varE;
EditCbText
end;
end;
end;% end for E else if(isa((simOut.(varA).(varB).(varC).(varD)),'timeseries'))
PlotData.(SimDataName).(varD) = simOut.(varA).(varB).(varC).(varD);
loadedVarName = varD;
EditCbText
end;
end;
end;% end for D else if(isa((simOut.(varA).(varB).(varC)),'timeseries'))
PlotData.(SimDataName).(varC) = simOut.(varA).(varB).(varC);
loadedVarName = varC;
EditCbText
end;
end;
end;% end for C else if(isa((simOut.(varA).(varB)),'timeseries'))
PlotData.(SimDataName).(varB) = simOut.(varA).(varB);
loadedVarName = varB;
EditCbText
end;
end;
end;% end for B else if(isa((simOut.(varA)),'timeseries'))
PlotData.(SimDataName).(varA) = (simOut.(varA));
loadedVarName = varA;
EditCbText
end;
end;
end;% end for A else if(isa(simOut,'timeseries'))
PlotData.(SimDataName) = simOut;
loadedVarName = simOut;
EditCbText
end;
end;
Und hier der Code für EditCbText:
Nachdem eine Variable gefunden wurde, wird beginnend mit der checkbox 'cb1' das entsprechende Element sichtbar gemacht und der angezeigte Name ist dann der Variablenname.
% Result auswerten
tmpList = fieldnames(result...)
% Das wäre die Ausgabe der Vektoren % Man kann hier außerdem die Vektoren auswählen, die weiter verarbeitet werden sollen
h.listBox = uicontrol(...
'Style', 'listbox',...
'Position', [55200450],...
'Backgroundcolor', 'white',...
'string', tmpList,...
'Value', 1);
Du speicherst "result" nur lokal in der Funktion. Wenn du das Result außerhalb der Funktion verwendet möchtest musst du es in der GUIDE Umgebung mit guidata lösen. Oder die etwas sauberere Art mit setappdata.
Du kannst gerne auch etwas mehr Code posten, dann kann ich mir das angucken was du wie aufgebaut hast.
danke für eure Hilfe, ich habe in den letzten Tagen natürlich weitergearbeitet und ein bisschen was zusammengestellt.
Im Anhang findet ihr das Ergebnis der letzten Tage. Das beschreibt ungefähr was ich machen wollte. Eine mat Datei konnte ich jetzt leider nicht hinzufügen, da diese vertraulich sind. Vielleicht habt ihr ja noch eine taugliche Datei über um das Programm zu testen.
Zum Programm:
In Callback pushbutton 3 ist das Laden vom File in den Workspace beschrieben. Dabei kann man im File einstellen ab welchem Ordner die Suche nach einer .mat Datei losgehen soll.
Durch den Update listbox button wird die Listbox aktualisiert und passt sich dem Workspace an.
Dann kann man zwei Variablen wählen und diese Zeichnen lassen.
Dazu habe ich folgende Frage:
Wie kann man die Achsen vertauschen. Wie ihr im m-file seht ist das ein bisschen verzwickt und daher wusste ich nicht wie man das realisieren kann.
Nach dem plot kann man noch ein Histogram anfertigen. Da fehlt mir bisher auch noch eine Möglichkeit das Histogramm anzupassen. Zum Beispiel durch Begrenzung der Abstufungen.
Wieso willst du es unbedingt in das Workspace schreiben? Du möchtest sie sicher in dem GUI verändern plotten etc, oder? Dann brauchst du nicht alles in das base Workspace zu schreiben. Das erschwer dir nur die Arbeit.
Da du mit GUIDE arbeitest bietet sich guidata(...) an. Damit kannst du die .mat Struktur direkt in der GUI speichern und von allen Methoden darauf zugreifen.
Nun hast du in dieser Methode zugriff auf das handles von deinem MainGUI. Also auf den Speicher deines GUIs. Dieser wird unter GUIDE automatisch erstellt und sieht etwa so aus:
Also ich habe jetzt folgenden Code, der aber nicht so ganz funktioniert. Ich möchte nun die .mat files direkt ins gui laden ohne den Umwg über den base workspace zu machen. Warum geht mein Code nicht?
Code:
function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
[FileName,PathName] = uigetfile('*.mat');
handles.messdata = load(FileName);
guidata(hObject,handles);
set(handles.listbox1,'String',handles.messdata);
Wenn ich den Pfad angebe, mit Path und File, dann tut sich aber auch nichts.
Code:
function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
[FileName,PathName] = uigetfile('*.mat');
handles.messdata = load([FileName,PathName]);
guidata(hObject,handles);
set(handles.listbox1,'String',handles.messdata);
Also was mich nervt ist, dass das ein alltägliches Problem ist, man im Internet einen Haufen Lösungsansätze findet und bei mir trotzdem keiner funktioniert.
Kann mir das jemand einmal korrigieren, ich finde meinen Fehler nicht.
Ich wäre sehr dankbar.
Der Fehler liegt glaube ich irgendwo bei der Load Funktion. Außerdem bin ich mir unsicher, ob man handles.messdata in die Klammer so schreiben kann.
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.