Verfasst am: 10.02.2014, 11:39
Titel: Vorschläge zur Verbeserung des Codes
Hallo,
an und für sich funktioniert mein Code, jedoch denke ich, dass man diesen optimieren kann. Zur Zeit versuche ich mich mit Matlab vertraut zu machen und bin über jeden Hinweis dankbar.
Mit einem GUI möchte ich via eines Pushbuttons eine Exceltabelle einlesen und die in Zeile 1 befindlichen Namen in statischen Textfeldern ausgeben lassen. So wie ich es geschrieben habe funktioniert es zwar, jedoch entsteht so sehr schnell sehr viel Script. Meine Frage ist, ob man das mit einer Schleife oder auch anders komprimieren kann???
Hier der Code
Code:
function buttonloadXLS_Callback(hObject, eventdata, handles) % hObject handle to buttonloadXLS (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.fileName = uigetfile('*.xlsx') guidata(hObject, handles);
setwertString(handles.wert1, eventdata, handles)
setwertString2(handles.wert2, eventdata, handles)
setwertString3(handles.wert2, eventdata, handles)
setwertString4(handles.wert2, eventdata, handles)
setwertString5(handles.wert2, eventdata, handles)
du hast recht mit der Annahme, dass man da noch einiges optimieren kann. Das kann man meisten immer, wenn viele Codezeilen ähnlich oder sogar identisch sind.
Gibt es einen Grund, warum du das alles in Funktionen gepackt hast?
Ich würde das ganze, ausgehend von der Grundaufgabe, so umsetzen:
Code:
FileName = 'Test.xlsx';
Count = 5; % Anzahl der Namen
Range = ['A1:' char(64 + Count) '1'];
Zunächst würde ich alle Namen auf einmal einlesen. Sonst öffnet Matlab meines Wissens nach 5 mal die Excel-Datei und da kann es auch mal zu Fehlern kommen, da Windows da etwas durcheinander kommt. Außerdem sollte es deutlich schneller gehen.
Die ausgelesenen Namen kannst du dann mit einer for-Schleife nach und nach in die statischen Textfelder eintragen. Ich würde dafür die eval-Funktion nutzen, weshalb wahrscheinlich gleich wieder 10 Leute aufschreien werden. Es geht sicher auch anders (besser?) .
Durch eval ist es möglich an den Tag-Namen "wert" noch eine Zahl dranzuhängen.
es funktioniert prima. Leider weiß ich über die Vor- und Nachteile einer "eval-Funktion" nicht bescheid, aber da es so wunderbar klapppt und der Code um ein vielfaches gekürzt ist, denke ich, dass es eine gute Lösung ist.
Zu deiner Frage, warum ich alles in Funktionen verpackt hatte: Nun ich hatte es so in einem Bsp. gesehen und hatte dieses für meine Augabenstellung angepasst, dabei kam halt das raus . Nun weiß ich es geht auch so .
Ich weiß nicht ob es hier angebracht ist, aber für alle die, die den Code nochmal im gesamten Kontext sehen wollen:
Code:
function buttonloadXLS_Callback(hObject, eventdata, handles) % hObject handle to buttonloadXLS (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.fileName = uigetfile('*.xlsx') guidata(hObject, handles);
fileName = handles.fileName;
Count = 3; % Anzahl der Namen
Range = ['A1:' char(64 + Count) '1'];
[numbers,colNames] = xlsread(fileName,'1',Range);
for i=1:Count
eval(['set(' ['handles.wert' num2str(i)] ', ''String'', colNames(i))' ]);
end
Der Funktion Eval kann ja ein beliebiger String übergeben werden. Dieser String wird dann ausgeführt.
Dadurch ist es relativ leicht möglich sich Befehle "zusammen zu basteln" und wie in deinem Beispiel den Namen eines Objektes zu ändern.
Leider wird das ganze dann aber ziemlich unübersichtlich und lässt sich natürlich auch nicht debuggen. Wenn es aber funktioniert braucht man das ja auch nicht . Vor allem bei so übersichtlichen Code wie hier sollte das gar kein Problem sein.
Es gibt aber natürlich immer viele Wege, um zur Lösung zu gelangen. So könnte man z.B. vorher die Namen der Objekte in eine Liste schreiben und dann irgendwie auslesen. Aber dann wird es auf eine andere Art und Weise wieder unübersichtlich.
Grüße
Headbucket
Edit: Der Code von Harald funktioniert und ist damit die bessere Lösung, da es noch etwas schneller ist. Ich hatte vorhin hin und her probiert bin aber einfach nicht auf diese Lösung gekommen. Das werde ich mir mal einprägen.
Vielen Dank euch beiden für die Hinweise und auch für die ergänzenden Worte.
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.