for k = 1:numel(files)% Alle Textdateien einlesen if ~isdir(files{k})
fileID = fopen(fullfile(fullpath,files{k}),'r');
data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
data{k} = cell2mat(data{k}); % Cell in Matrix konvertieren fclose(fileID);
end end;
Die Dateien werden auch eingelesen und die Anzahl der Dateien angezeigt. So weit so gut.
Jetzt möchte ich mittels Radiobuttons in einer Button Group (SelectionChangeFcn ist erstellt) auf die jeweiligen Dateien zugreifen und bestimmt Werte plotten bzw. in einer Tabelle darstellen. Mit Radiobutton1 sollen also Werte aus Datei 1, mit Radiobutton2 Werte aus Datei 2... usw. verarbeitet werden. Mein bisheriger Code dafür ist:
Code:
% --- Executes when selected object is changed in datasetsbuttongroup. function datasetsbuttongroup_SelectionChangeFcn(hObject, eventdata, handles) % hObject handle to the selected object in datasetsbuttongroup % eventdata structure with the following fields (see UIBUTTONGROUP) % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty if none was selected % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA)
for k = 1 set(handles.datatable,'Data',data{k});
axes(handles.dataplot);
x = data{k}(:,1);
y = data{k}(:,2);
scatter(x,y);
title('Kraft-Weg-Kurve');
ylabel('Load [µN]');
xlabel('Depth [nm]');
grid on;
end
Leider funktioniert das so nicht um beim Klicken des Radiobuttons kommt folgende Fehlermeldung:
Undefined variable data.
Error in
indenter1>datasetsbuttongroup_SelectionChangeFcn (line
741)
set(handles.datatable,'Data',data{k});
Error in gui_mainfcn (line 96)
feval(varargin{:});
Error in indenter1 (line 43)
gui_mainfcn(gui_State, varargin{:});
Error in
@(hObject,eventdata)indenter1('datasetsbuttongroup_SelectionChangeFcn',get(hObject,'SelectedObject'),eventdata,guidata(get(hObject,'SelectedObject')))
Error in hgfeval (line 63)
feval(fcn{1},varargin{:},fcn{2:end});
Error in
uitools.uibuttongroup/childAddedCbk>manageButtons
(line 79)
hgfeval(cbk, source, evdata);
Error while evaluating uicontrol Callback
Die Variable "data" bzw. "data{k}" habe ich doch schon in der Callback-Funktion des Pushbuttons definiert.? Muss ich die für die Radiobuttons dann erneut definieren?
Ich hoffe, mir kann da jemand von euch weiterhelfen! Kommt gut ins neue Jahr!
Viele Grüße,
% --- Executes on button press in browsebutton. function browsebutton_Callback(hObject, eventdata, handles) % hObject handle to browsebutton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
for k = 1:numel(files)% Alle Textdateien einlesen if ~isdir(files{k})
fileID = fopen(fullfile(fullpath,files{k}),'r');
data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
data{k} = cell2mat(data{k}); % Cell in Matrix konvertieren fclose(fileID);
end end;
% --- Executes when selected object is changed in datasetsbuttongroup. function datasetsbuttongroup_SelectionChangeFcn(hObject, eventdata, handles) % hObject handle to the selected object in datasetsbuttongroup % eventdata structure with the following fields (see UIBUTTONGROUP) % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty if none was selected % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA)
Ich habe in meinen Ordnern immer so um die 60 Dateien und mit meiner bisherigen Vorgehensweise müsste ich ja dann alle in separaten Handels abspeichern, wodurch mein Skript recht ausgedehnt und unübersichtlich wird. Gibt es da vielleicht eine elegantere Lösung?
ich hätte da nochmal eine Rückfrage. Und zwar klappt das mit den Radiobuttons nun wunderbar, jedoch habe ich zu jedem Radiobutton auch noch eine Checkbox. Die Checkboxes (insgesamt 60) besitzen in meinem Skript jeweils einen eigenen Callback, da diese nicht als Buttongroup zusammenzuführen sind (oder?). Die Checkboxes dienen dazu, dass der User auswählen kann, welche der Dateien auch wirklich im nächsten Schritt bearbeitet und ausgewertet werden sollen. D. h. ich möchte, dass wenn die Box aktiviert ist, die Werte gespeichert und an ein neues GUI übergeben werden. Ich hätte gedacht es funktioniert so:
Code:
% --- Executes on button press in next1. function next1_Callback(hObject, eventdata, handles) % hObject handle to next1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
data = handles.data;
for l = 1:length(data)
checkboxvalue = get(handles.(['checkbox' num2str(l)]),Value)
if checkboxvalue == 1 setappdata(0,'indenter1',data); % Datenübergabe end end;
Es kommt keine Fehlermeldung, aber es werden alle Daten übergeben, auch die, wo die Checkbox nicht gecheckt ist... Was mache ich falsch?
Muss ich in die einzelnen Callbacks der Checkboxes auch noch etwas einfügen?
Keiner eine Idee? Hänge immer noch an der Stelle mit der Übergabe der "gecheckten" Daten... und habe auch im Rest des Internets keine Hilfe finden können...
Ich verstehe den Zweck des Codes nicht.
Was bedeutet "es werde alle Daten übergeben"? Du schreibst ja "data" in die ApplicationData des Root-Objektes, und das hängt gar nicht davon ab, welche Checkbox ausgewählt wurde.
Du brauchst GUIDATA nicht, da die Variable "handles" nicht geändert wurde.
Guten Morgen Jan (und auch natürlich an alle anderen ),
ich bin noch Anfänger was das Arbeiten mit Matlab betrifft und muss mich für meine Diplomarbeit da erst richtig einarbeiten... Das Programm ist wirklich genial, aber ich muss sagen, dass ich ohne euch wahrscheinlich aufgeschmissen wäre...
for k = 1:numel(files)% Alle Textdateien einlesen if ~isdir(files{k})
fileID = fopen(fullfile(fullpath,files{k}),'r');
data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
data{k} = cell2mat(data{k}); % Cell in Matrix konvertieren fclose(fileID);
end end;
eine je Ordner unterschiedliche Anzahl von .txt - Dateien in mein GUI. Das klappt auch, und dank deiner Hilfe, Jan, werden mir die Messergebnisse - es sind Kraft-Weg-Kurven - per Radiobutton-Klick für jede vorhandene Datei angezeigt. Mit den Checkboxes möchte ich nun selektieren, welche Datei bzw. welcher Datensatz zur weiteren Auswertung an ein folgendes GUI übergeben wird. D. h. ich möchte die Variable "data" so anpassen, dass sie nur die data der Messreihen enthält, für die die Checkbox gecheckt ist. Alternativ wäre es natürlich auch möglich, dass eine neue Variable mit den "gecheckten" Datensätzen erstellt wird.
Ich hoffe, mein Problem und der Zweck meines Codes wird damit ein wenig deutlicher.
also ich habe mein Problem jetzt folgendermaßen gelöst:
Code:
% --- Executes on button press in next1. function next1_Callback(hObject, eventdata, handles) % hObject handle to next1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
Die cells werden auch wie gewünscht aus dem Array gelöscht. Wie müsste ich den code modifizieren, wenn ich die cells nur clearen will, sodass der Array seine ursprüngliche Größe behält? Mit
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.