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

Vorschläge zur Verbeserung des Codes

 

Anfänger_ohne_Background
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.02.14
Wohnort: Rostock
Version: 2013a
     Beitrag Verfasst am: 10.02.2014, 11:39     Titel: Vorschläge zur Verbeserung des Codes
  Antworten mit Zitat      
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)

function setwertString(hObject, eventdata, handles)
fileName = handles.fileName;
[numbers,colNames] = xlsread(fileName,'1','A1');
set (hObject,'string',colNames);

function setwertString2(hObject, eventdata, handles)
fileName = handles.fileName;
[numbers,colNames] = xlsread(fileName,'Abw','B1');
set (hObject,'string',colNames);

function setwertString3(hObject, eventdata, handles)
fileName = handles.fileName;
[numbers,colNames] = xlsread(fileName,'Abw','C1');
set (hObject,'string',colNames);

function setwertString4(hObject, eventdata, handles)
fileName = handles.fileName;
[numbers,colNames] = xlsread(fileName,'Abw','D1');
set (hObject,'string',colNames);

function setwertString5(hObject, eventdata, handles)
fileName = handles.fileName;
[numbers,colNames] = xlsread(fileName,'Abw','E1');
set (hObject,'string',colNames);

function wert1_Callback(hObject, eventdata, handles)
function wert1_CreateFcn(hObject, eventdata, handles)

function wert2_Callback(hObject, eventdata, handles)
function wert2_CreateFcn(hObject, eventdata, handles)

function wert3_Callback(hObject, eventdata, handles)
function wert3_CreateFcn(hObject, eventdata, handles)

function wert4_Callback(hObject, eventdata, handles)
function wert4_CreateFcn(hObject, eventdata, handles)

function wert5_Callback(hObject, eventdata, handles)
function wert5_CreateFcn(hObject, eventdata, handles)
 


Vielen Dank schon mal im Voraus Smile
Private Nachricht senden Benutzer-Profile anzeigen


Headbucket
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 03.12.13
Wohnort: Dresden
Version: R2007B
     Beitrag Verfasst am: 10.02.2014, 12:36     Titel:
  Antworten mit Zitat      
Hallo,

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'];

[numbers,colNames] = xlsread(FileName,'1',Range);

for i=1:Count
   eval(['set(' ['handles.wext' num2str(i)] ', ''String'', colNames(i))' ]);
end


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?) Smile.
Durch eval ist es möglich an den Tag-Namen "wert" noch eine Zahl dranzuhängen.

Grüße
Headbucket
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_ohne_Background
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.02.14
Wohnort: Rostock
Version: 2013a
     Beitrag Verfasst am: 10.02.2014, 14:05     Titel:
  Antworten mit Zitat      
Vielen Dank Headbucket,

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 Very Happy. Nun weiß ich es geht auch so Smile.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2014, 14:29     Titel:
  Antworten mit Zitat      
Hallo,

ohne eval sollte das wie folgt gehen:
Code:
set(handles.(['wert' num2str(i)]), 'String', colNames(i))


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Headbucket
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 03.12.13
Wohnort: Dresden
Version: R2007B
     Beitrag Verfasst am: 10.02.2014, 14:31     Titel:
  Antworten mit Zitat      
Schön, dass alles noch funktioniert Wink.

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 Smile. 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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_ohne_Background
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.02.14
Wohnort: Rostock
Version: 2013a
     Beitrag Verfasst am: 10.02.2014, 14:42     Titel:
  Antworten mit Zitat      
Vielen Dank euch beiden für die Hinweise und auch für die ergänzenden Worte.
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 - 2025 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.