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

Guide zum Auswählen von diskreten Werten von zwei Variablen

 

rennur
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 13.02.12
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 26.06.2014, 14:54     Titel: Guide zum Auswählen von diskreten Werten von zwei Variablen
  Antworten mit Zitat      
Hallo allerseits,

ich blicke leider überhaupt nicht durch, was GUIDE betrifft. Ich habe schon diverse Tutorials gelesen und Forenbeiträge durchsucht, nur kann ich dennoch ein meiner Meinung nach recht einfaches Problem nicht lösen.

Ich habe prinzipiell eine Funktion, welche 6 verschiedene Lastvektoren und 3 verschiedene Optimierungsverfahren miteinander beliebig kombinieren soll. Das macht zusammen also (vorerst) 18 Kombinationsmöglichkeiten. Ich könnte jetzt eine GUI erstellen mit 18 Knöpfen, aber ich bin der Meinung, dass das eleganter ist, wenn die Lastvektoren per Radiobutton in der 1. Button Group, das Optimierungsverfahren in der 2. Button Group per Radiobutton ausgewählt werden kann.
Je nach wahl muss ein Wert für den Lastvektor und ein Wert für die Optimierungsmethode an die eigentliche Funktion übergeben werden. Die eigentliche Funktion würde ich prinzipiell per Pushbutton starten.

Jetzt bekomme ich es aber leider überhaupt nicht hin, mit den Radio Buttons die Variablen zu setzen und diese zu übergeben an den Push Button, welcher dann die Funktion aufruft?
Ich weiß, dass man da im uipanel mit der SelectionChangeFCN arbeiten muss und ich habe dort auch eine Switch-Auswahl drin, nur komme ich mit handles usw. nicht klar. Der Befehl guidata(hObjects, handles) hitner dem Switch verursacht bei mir immer Fehler und ich weiß noch nicht mal, ob meine Werte überhaupt gesetzt werden, wenn ich auf den Radiobutton klicke?

Ich hoffe, dass mir hier jemand helfen kann und möchte?
Private Nachricht senden Benutzer-Profile anzeigen


draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 26.06.2014, 20:18     Titel:
  Antworten mit Zitat      
Hallo,

ich bin mir nicht ganz sicher ob ich Dein Problem komplett verstanden habe.

Du hast...
...6 unterschiedliche Lastvektoren von denen einer ausgewählt wird
...3 Möglichkeiten für Optimierungsverfahren
...1 Knopf zum Starten der ausgewählten Berechnung.

Dein Plan ist die 6 Lastvektoren sowie die 3 Optimierungsverfahren jeweils mit einem Radiobutton "auswählbar" zu machen und die so ausgewählte Berechnung per Pushbutton zu starten. Das setzt voraus, dass die Einträge der Lastvektoren nicht vom Nutzer definiert werden und auch die Berechnungsverfahren irgendwo in dem m-file definiert werden.

Hierfür würde ich zwei Alternativen vorschlagen:

1. Eine Dropdownliste für die Vekoren und eine für die Berechnungsverfahren.

2. Eine uitable mit zwei Spalten und einer Zeile (funzt quasi wie die zwei Dropdownlisten ist aber noch eleganter, da Du alle Informationen auf einmal extrahieren kannst)

In beiden Fällen Sind die Berechnungsvorschriften in der Callbackfunction des Pushbuttons zu finden.

Da mein Favorit die uitable ist hier das Beispiel:

In der opening function kommt rein:

Code:


%Adressvektor der Lastvektoren
handles.Lastvektorheader={'LV1', 'LV2', 'LV3', 'LV4', 'LV5', 'LV6'};

%Adressvektor der Optimierungsverfahren (wird im "Switch" Fall nicht %benötigt
handles.Optimierungsverfahrenheader={'OV1', 'OV2', 'OV3'};


%definieren der uitable
set(handles.uitable1, 'Columnname',{'Lastvektor', 'Optimierungsverfahren'}, 'data',{'LV1', 'OV1'} ,'Columneditable', [true true],'Columnformat',{handles.Lastvektorheader handles.Optimierungsverfahrenheader}, 'Columnwidth', { 30 30});

% Update handles structure
guidata(hObject, handles);

%Der letzte Befehl muss IMMER am Ende jeder Funktion im m-file der gui %stehen wenn eine Änderung im handles struct erfolgt ist. Ansonsten %wissen die anderen Funktionen in der gui nichts von der Änderung.


 


Hier der Code für den Pushbutton

Code:


%Definition der Lastvektoren in Form eines cell-arrays gemäß dem %zugehörigen handles.Lastvektorheader (schematisch dargestellt)

handles.Lastvektor={{nxm-Lastvektor1}...{kxl-Lastvektor6}};

%Auslesen der Eingaben aus der uitable
%Das macht man hier in der Pushbuttoncbf damit erst jetzt relevant wird %was in der tabelle steht
Eingaben=get(handles.uitable1, 'data');

%Jetzt die Switch Abfrage für die Optimierungsverfahren  

Switch Eingaben{1,2}

case 'OV1'
       Lastvektor=handles.Lastvektor{strcmp(Eingaben{1,2},handles.Lastvektorheader)};%Kann sein dass hier noch ein {:} dran muss, falls der Vektor %immernoch im cell format dasteht.

case 'OV2'


case 'OV3'


 


Das wäre zumindest mal ein grober Vorschlag.

MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rennur
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 13.02.12
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.06.2014, 06:30     Titel:
  Antworten mit Zitat      
Guten Morgen Georg,

vielen Dank für deine anschauliche Anleitung. Ich glaube, dass ich mit meinem Denken noch zu sehr in den "normalen" Functions stecke. Ich will die ganze Zeit mit der GUI Variablen definieren, die ich dann an andere Funktionen übergebe, welche damit weiter rechnen.

Prinzipiell hast du fast exakt das getroffen, was ich benötige.
Der Pushbutton ruft ja dann die eigentliche Funktion auf. Von dort werden auch die Lastvektoren aus .mat Files eingelesen und per Switch die Optimierungsstrategie ausgewählt.

Was ich aus der GUI lediglich benötige, sind die beiden Variablen, die das Einlesen der Lastvektoren und die Wahl des Optimierers steuern.
Diese heißen bei mir Last und EvoStrat.

Liege ich richtig mit der Annahme, dass sich im Pushbutton Teil dann der Code noch ein wenig vereinfacht? Statt die Vektoren zu definieren und danach zu gucken, welche Auswahl in der uitable getroffen wurde, reicht es ja nun aus, je nach Auswahl die Variablen Last und EvoStrat zu definieren und diese beim Aufruf der Eigentlichen Funktion zu übergeben?

Code:
% für den Pushbutton

% Das Definieren/Einlesen der Vektoren entfällt, da das innerhalb der aufzurufenden Funktion passiert je nach gesetzter Variable

%Auslesen der Eingaben aus der uitable
Eingaben=get(handles.uitable1, 'data');

%Jetzt die Switch Abfrage für die Optimierungsverfahren  

Switch Eingaben{1,1}
case 'OV1'; EvoStrat = 1
case 'OV2'; EvoStrat = 2
case 'OV3'; EvoStrat = 3
end

Switch Eingaben{1,2}
case 'LV1'; Last = 1;
...
case 'LV6'; Last = 6;
end

% Hier kommt der Aufruf der eigentlichen Funktion, die als m-File vorliegt ohne Rückgabewerte
A_Main(Last, EvoStrat)
 


Kann das so funktionieren? Auf diese Weise brauche ich nicht großartig mit den Handles jonglieren und mein Programm macht ja sowieso alles. Ich will mit der GUI ja nur umgehen, dass ich die Auswahl immer im Quelltext ändern muss?

Ich mag MATLAB! Aber diese GUI Programmierung finde ich anders als den Rest des Programms bisher nicht wirklich intuitiv.
Private Nachricht senden Benutzer-Profile anzeigen
 
rennur
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 13.02.12
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.06.2014, 06:34     Titel:
  Antworten mit Zitat      
Undefined variable or function Last might refer to the function last.
Error in A_Gui>Berechnung_Callback (line 113)
A_Main(Last, EvoStrat)
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in A_Gui (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in
@(hObject,eventdata)A_Gui('Berechnung_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating uicontrol Callback


Ich habe das kurz umgesetzt ... Muss ich meine Variablen im C++ Style noch irgendwo vorher deklarieren?
Zeile 113 ist genau der Aufruf der Hauptfunktion
Private Nachricht senden Benutzer-Profile anzeigen
 
rennur
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 13.02.12
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.06.2014, 06:52     Titel:
  Antworten mit Zitat      
Fehler gefunden, behoben.
Ich habe Eingaben {1,1} und {1,2} vertauscht und somit nicht die erwarteten Eingaben dort gefunden.
Jetzt funktioniert genau so, wie es soll.


Vielen vielen Dank Georg! =)
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 27.06.2014, 20:55     Titel:
  Antworten mit Zitat      
Hallo,

ich habe am Anfang das System hinter guide auch nicht verstanden. Man muss da erst mal ein paar notwendige Eingaben einfach so hinnehmen. Irgendwann macht es dann klick. Bei mir war es so. Ich mache jetzt eigentlich alles mit guide, da man immer irgendeine Eingabe braucht und eben lieber Knöpfe drückt.

In Deinem Fall kannst Du die Switch Abfragen einfach weg lassen:

Code:

%Adressvektor der Lastvektoren
handles.Lastvektorheader={'LV1', 'LV2', 'LV3', 'LV4', 'LV5', 'LV6'};
handles.Lastvektor=[1 2 3 4 5 6];

%Adressvektor der Optimierungsverfahren
handles.Optimierungsverfahrenheader={'OV1', 'OV2', 'OV3'};
handles.Optimierungsverfahrenvektor=[1 2 3];


Eingaben=get(handles.uitable1, 'data');

 

Last=handles.Lastvektor{strcmp(Eingaben{1,2},handles.Lastvektorheader)};

EvoStrat=handles.Optimierungsverfahrenvektor{strcmp(Eingaben{1,1},handles.Optimierungsverfahrenheader)};

A_Main(Last, EvoStrat)

 


So kannst Du Dir die Switch Abfrage komplett sparen.

MFG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
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.