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

Einzelne vektoren aus .mat Datei in GUI einfügen

 

anleger92
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.02.2015, 22:50     Titel: Einzelne vektoren aus .mat Datei in GUI einfügen
  Antworten mit Zitat      
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

selectField = fieldnames(handles.a);
 


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.

Könnt ihr mir da weiterhelfen?

Vielen Dank schonmal.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen


anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2015, 13:44     Titel:
  Antworten mit Zitat      
Also was passieren soll ist, dass ich die geladenen Daten am liebstenirgendwo darstellen möchte.

Durch die load funktion sollten die Variablen doch ins Workspace geladen werden, warum geht das bei mir nicht?
Code:

[filenameResults,pathnameResults] = uigetfile('*.mat', 'Datei auswählen.');
result = load(fullfile(pathnameResults,filenameResults));  
 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
carnefix
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2015, 08:50     Titel:
  Antworten mit Zitat      
anleger92 hat Folgendes geschrieben:


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

assignin('base','Variable',Variable)
 


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.

Code:


cbName = ['cb',num2str(cbNr)];
    if(strcmp(get(handles.(cbName),'String'),cbName))
        cbNr = cbNr+1;
    else
        set(handles.(cbName),'String',loadedVarName);
        set(handles.(cbName),'Visible','on');
        cbNr = cbNr+1;
    end;

 



Ich hoffe, dass ich dich mit meinem 'schlecht geschriebenen code' nicht weiter verwirrt habe und dir weiterhelfen konnte.



Gruß carnefix
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 11.02.2015, 11:00     Titel:
  Antworten mit Zitat      
Hi,

nutze dazu die Listbox


nach dem

Code:
[file,path] = uigetfile('*.mat', 'Datei auswählen.');
result = load(strcat(path,file));

% 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',         [5 5 200 450],...
    'Backgroundcolor',  'white',...
    'string',           tmpList,...
    'Value',            1);
 


Wenn du mehrere Elemente gleichzeitig aussuchen möchtest, musst du min und max der Listbox anpassen:

https://nf.nci.org.au/facilities/so.....eating_guis/ch_ove34.html
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 11.02.2015, 11:07     Titel:
  Antworten mit Zitat      
Kurz zum Thema Workspace,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2015, 18:17     Titel:
  Antworten mit Zitat      
Hey Leute,

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.

Wisst ihr da weiter?

Vielen Dank schonmal

lb2.m
 Beschreibung:

Download
 Dateiname:  lb2.m
 Dateigröße:  6.38 KB
 Heruntergeladen:  399 mal
lb2.fig
 Beschreibung:

Download
 Dateiname:  lb2.fig
 Dateigröße:  46.34 KB
 Heruntergeladen:  388 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 12.02.2015, 09:36     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 12.02.2015, 13:16     Titel:
  Antworten mit Zitat      
Du kannst die Fragen auch hier Stellen, vielleicht hilft es dann auch noch jemand anderem

Beim GUIDE ist der Speicher quasi bereits reserviert. Den musst du nur noch nutzen.

Du musst erst einmal handles aktualisieren bevor du den Callback komplett ausführst.

Code:
function pushbutton3_Callback(hObject, eventdata, handles)
% Hier ist hObject dein MainGUI und nicht der Button
handles = guidata(hObject);


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

handles ist dabei einfach ein Struct.

Jetzt kannst du lustige Werte in das handles schreiben:

Code:
handles.lustigeZahl = 0;


Genau so kannst du handles.ProjectData = load(pfad deiner Daten) laden. Jetzt hast du im "lokalen handles" das ProjectData gespeichert.

Jetzt musst du das handles mit den neuen Informationen überschreiben oder besser aktualisieren.

guidata(hObject,handles);

Jetzt kannst du in anderen Methoden, Callbacks etc. auf das ProjectData zugreifen.

Du musst nur in jeder Methode erstmal das handles des Figures laden.

Alternative:
Du kannst das ganze aber auch mit dem übergebenen handles machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2015, 19:41     Titel:
  Antworten mit Zitat      
Alles klar, dann klären wir das hier Very Happy .

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);
 


Das ist übrigens die Fehlermeldung:

Error using load
Unable to read file '23_14-50_0007.mat'. No such file or directory.

Error in givemeatry>pushbutton1_Callback (line 83)
handles.messdata = load(FileName);

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

Error in givemeatry (line 42)
gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)givemeatry('pushbutton1_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating UIControl Callback



Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 12.02.2015, 20:13     Titel:
  Antworten mit Zitat      
Hi, dein Pfad ist falsch, du übergibst nur den Namen, aber den Pfad musst du natürlich auch angeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2015, 10:46     Titel:
  Antworten mit Zitat      
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);
 


Ooh mann, ich werde verrückt!!
Überall steht das doch so und bei allen klappts, warum wird meine listbox nicht gefüllt??
Private Nachricht senden Benutzer-Profile anzeigen
 
anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2015, 15:18     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 15.02.2015, 17:47     Titel:
  Antworten mit Zitat      
Hi, erstmal hast du Path mit File vertauscht.

Code:

function pushbutton1_Callback(hObject, eventdata, handles)
handles = guidata(hObject);

[FileName,PathName] = uigetfile('*.mat');

%Ja du kannst das genau so schreiben
handles.messdata = load(strcat(PathName,FileName));

guidata(hObject,handles);

set(handles.listbox1,'String',handles.messdata);


Müsste jetzt funktionieren.

Was genau ist dein messdata? Ist es ein Struct mit Feldern?
Private Nachricht senden Benutzer-Profile anzeigen
 
anleger92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 24.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2015, 13:08     Titel:
  Antworten mit Zitat      
Hi stealth_mx,

danke für deine Antwort.

Also die zu ladende .mat Datei enthält Vektoren vom Typ 6000x1 double bis zu 60000x1 double .


Als Fehlermeldung bekomme ich nun:


Error using matlab.ui.control.UIControl/set
While setting the 'String' property of UIControl:
String should be char, numeric or cell array datatype.

Error in givemeatry>pushbutton1_Callback (line 90)
set(handles.listbox1,'String',handles.messdata);

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

Error in givemeatry (line 42)
gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)givemeatry('pushbutton1_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating UIControl Callback


hab mal vor das set, str2num geschrieben, aber da passiert nichts. Also es gibt wieder eine Fehlermeldung.
Weißt du da weiter?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
carnefix
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2015, 13:33     Titel:
  Antworten mit Zitat      
anleger92 hat Folgendes geschrieben:


hab mal vor das set, str2num geschrieben, aber da passiert nichts. Also es gibt wieder eine Fehlermeldung.

Grüße


Probier es mal mit num2str. Vielleicht könnte es so funktionieren.

Code:

set(handles.listbox1,'String',num2str(handles.messdata));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.