Verfasst am: 22.05.2012, 14:38
Titel: Erstellen einer uitable
Hallo,
ich bin gerade dabei eine GUI zu erstellen, die verschiedene Daten verarbeiten und ausgeben soll. Die Daten sind Informationen über physikalische Größen, die zueinander in Relation gesetzt werden sollen. Dazu sollen die Korrelationen, also Abhängigkeiten, zwischen den verschiedenen Größen von dem Benutzer meiner GUI per Hand in eine Tabelle eingegeben werden können.
Nun ist meine Frage, wie ich diese variable Tabelle erstelle (sie soll je nach Anzahl n der Größen die Form (n x n) besitzen) und wie es möglich ist, dass der Benutzer die Korrelationen dort passend eingibt. Dafür soll er die Korrelation zwischen zwei Größen nur einmal eingeben müssen, d.h. wenn er in der 1. Zeile und in der 2. Spalte einen Wert eingibt, soll die Tabelle diesen Wert automatisch auch in die 2. Zeile und 1. Spalte schreiben, so dass am Ende eine symmetrische Matrix, bzw. Tabelle entsteht. Am Ende sollten alle Werte in einer Matrix gespeichert werden und an das Workspace übergeben werden.
Hat jemand Tipps für mich, wie diese Erstellung funktioniert? Im Moment bin ich so weit, dass ich die Tabelle erstellen kann und der Benutzer seine Daten eingeben kann. Jedoch kann er wahlos Werte in alle Zeilen und Spalten schreiben und die Speicherung der Werte funktioniert auch noch nicht.
Schon mal vielen Dank für jede Hilfe und für die Mühe!
Verfasst am: 22.05.2012, 22:36
Titel: Re: Erstellen einer uitable
Hallo lila_gepard,
Wenn Du die relevanten Teile Deines Codes postest, wäre es einfacher Erweiterungen vorzuschlagen. Ohne den Code zu sehen ist es dagegen mit viel Raterei verbunden.
function edit_number_Callback(hObject, eventdata, handles) % hObject handle to edit_user_R (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit_user_R as text % str2double(get(hObject,'String')) returns contents of edit_user_R as a double
number=str2double(get(hObject,'String'));
coefficients=zeros(number,number);
assignin('base',coefficients',coefficients);
function uitable_dependency_CellEditCallback(hObject, eventdata, handles)
sel=eventdata.Indices;
if sel(1,1)==sel(1,2)
eventdata.EditData=1;
end evalin('base',coefficients');
coefficients=get(hObject,'Data');
assignin('base',coefficients',coefficients);
Also die Tabelle habe ich zu Beginn über Guide erstellt (an der richtigen Stelle) und die Sichtbarkeit auf off gestellt.
Über das Edit-Textfeld wird die Anzahl (number) der Größen eingegeben und anschließend eine quadratische Null-Matrix erstellt.
Anschließend wird die Sichtbarkeit der Tabelle auf on gestellt und ihre Einträge auf die einer Einheitsmatrix verändert.
Danach habe ich versucht, eine eigene Callbackfunktion für die Tabelle zu schreiben. Dabei soll zum Einen beachtet werden, dass die Einträge auf der Hauptdiagonalen immer 1 bleiben sollen und zum Anderen, dass die Werte, die eingetragen wurden, in meiner davor erstellten Matrix gespeichert werden!
Die Matrix wird zwar richtig abgespeichert, jedoch sind die Einträge der Hauptdiagonalen leider noch veränderbar. Weiterhin habe ich keine Ahnung wie man diese Symmetrie der Matrix sicherstellt. Gibt es eine Möglichkeit auf die einzelnen Tabelleneinträge (über die Indizes) zuzugreifen, um diese veränderbar/nicht veränderbar zu setzen und den relevanten Einträgen die gleichen Zahlen zuzuweisen?
Die Diagonal-Elemente könntest Du schützen, indem Du den CellSelectionCallback reagieren läßt, wenn ein Diagonal-Element selektiert wird.
Auch das Spiegeln der Eingaben an der Diagonalen ist nicht schwierig. Aber der Transport der Daten per ASSIGNIN und EVALIN ist so fehleranfällig, dass das eigentliche Problem für mich nebensächlich wird. Wenn Du ein zuverlässiges Programm schreiben möchtest, lasse EVAL, EVALIN und ASSIGN grundsätzlich weg. Es gibt immer eine bessere Lösung. Siehe SETAPPDATA, GUIDATA, SET(GCF, 'UserData') oder speichere alle Werte innerhalb der Tabelle, wo sie ja sowieso schon gespeichert sind. Eine doppelte Speicherung führt leichter zu Inkonsistenzen, ohne einen Nutzen zu haben.
Du kann im CelleditedCallback die Zeilen- und Spalten-Indices der bearbeiteten Table-Zelle erhalten. Dann läßt sich auch einfach durch vertauschen der beiden Indices der entsprechende Wert auf der anderen Siete der Diagonalen setzen.
Gruß, Jan
Einstellungen und Berechtigungen
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.