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

Programmoptimierung

 

DerThomas
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 28.01.2011, 09:33     Titel: Programmoptimierung
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein GUI erstellt das mir in Abhängigkeit der Auswahl in einem Popupmenü zwischen 3 und 9 Werte berechnen soll.

Damit meine ich, wenn Value 1 im Popupmenü gewählt wird, werden 3 Werte berechnet (über einen langen Rechenweg, den ihr unten seht) und wenn man Value 2 wählt, werden beispielsweise 4 Werte berechnet.
Die berechneten Werte werden dabei immer mit "Indices" von 1 an durchnummeriert.

Da ich ziemlich wenig Ahnung von Matlab habe, wollte ich mich informieren, ob es Möglichkeiten gibt, meinen Code zu optimieren, da mein Programm so ziemlich langsam ist.
Ganz in eine Schleife einbinden funktioniert leider nicht, da ich zum Beispiel immer andere Zellen der Excel-Tabelle benötige.
Wäre nett, wenn ihr mal drüber schauen könntet und mir ein paar Anregungen gebt. So kann ich evtl. bisschen was dazu lernen. Danke!

Schönen Gruß
Thomas


Code:

value = get(pm2h, 'Value');
     switch value
          case 1
               Fax1 = (str2double(pmax1) / 10) * Ab1;   % Berechnung der Axialkraft
               Fax2 = (str2double(pmax2) / 10) * Ab1;   % Berechnung der Axialkraft
               Fax3 = (str2double(pmax3) / 10) * Ab1;   % Berechnung der Axialkraft
               
               Faxeff1 = Fax1 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               Faxeff2 = Fax2 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               Faxeff3 = Fax3 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               
               Fr1 = str2double(mue) * Faxeff1;
               Fr2 = str2double(mue) * Faxeff2;
               Fr3 = str2double(mue) * Faxeff3;
               
               rlam = realsqrt(((str2double(Da)/2)^2 + (str2double(Di)/2)^2)/2);
               
               Mlam1 = rlam * Fr1 /1000;
               Mlam2 = rlam * Fr2 /1000;
               Mlam3 = rlam * Fr3 /1000;
               
               Mk1 = Mlam1/kb1_m2;
               Mk2 = Mlam2/kb1_2;
               Mk3 = Mlam3/kb1_6;
               
               M1 = round((str2double(z) * Mk1)*1)/1;
               M2 = round((str2double(z) * Mk2)*1)/1;
               M3 = round((str2double(z) * Mk3)*1)/1;
               
               set(etr1h,'String',num2str(M1));
               set(etr2h,'String',num2str(M2));
               set(etr3h,'String',num2str(M3));
               set(str1h,'String','Gang -2 [Nm]');
               set(str2h,'String','Gang 2 [Nm]');
               set(str3h,'String','Gang 6 [Nm]');
               
               set(etr1h, 'Visible', 'on');
               set(str1h, 'Visible', 'on');
               set(etr2h, 'Visible', 'on');
               set(str2h, 'Visible', 'on');
               set(etr3h, 'Visible', 'on');
               set(str3h, 'Visible', 'on');
               set(etr4h, 'Visible', 'off');
               set(str4h, 'Visible', 'off');
               set(etr5h, 'Visible', 'off');
               set(str5h, 'Visible', 'off');
               …
               set(str9h, 'Visible', 'off');
               
               
               pmax_1 = str2double(pmax1);
               pmax_2 = str2double(pmax2);
               pmax_3 = str2double(pmax3);
               max_Mom = str2double(maxMom);
               
               xlswrite('Diagramme.xls', M1, 1, 'B2');
               xlswrite('Diagramme.xls', pmax_1, 1, 'C2');
               xlswrite('Diagramme.xls', M2, 1, 'D2');
               xlswrite('Diagramme.xls', pmax_2, 1, 'E2');
               xlswrite('Diagramme.xls', M3, 1, 'F2');
               xlswrite('Diagramme.xls', pmax_3, 1, 'G2');
               Dmom1 = xlsread('Diagramme.xls', 1, 'B1:B3');
               Dp1 = xlsread('Diagramme.xls', 1, 'C1:C3');
               Dmom2 = xlsread('Diagramme.xls', 1, 'D1:D3');
               Dp2 = xlsread('Diagramme.xls', 1, 'E1:E3');
               Dmom3 = xlsread('Diagramme.xls', 1, 'F1:F3');
               Dp3 = xlsread('Diagramme.xls', 1, 'G1:G3');
               
               xlswrite('Diagramme.xls', max_Mom, 1, 'T1');
               DmaxMom = xlsread('Diagramme.xls', 1, 'T1:T2');
               DpmaxMom = xlsread('Diagramme.xls', 1, 'U1:U2');
               
               set(a1h, 'Visible', 'on');
               hold(a1h, 'off');
               p1h = plot(a1h, Dmom1, Dp1);
               hold(a1h, 'on');
               p1h = plot(a1h, Dmom2, Dp2, 'r');
               p1h = plot(a1h, Dmom3, Dp3, 'g');
               p1h = plot(a1h, DmaxMom, DpmaxMom, 'k--');
               legend('-2. Gang', '2. Gang', '6. Gang', 'maximales Turbinenmoment', 2);

          case 2
               Fax1 = (str2double(pmax1) / 10) * Ab2;   % Berechnung der Axialkraft
               Fax2 = (str2double(pmax2) / 10) * Ab2;   % Berechnung der Axialkraft
               Fax3 = (str2double(pmax3) / 10) * Ab2;   % Berechnung der Axialkraft
               Fax4 = (str2double(pmax4) / 10) * Ab2;   % Berechnung der Axialkraft
                         
               Faxeff1 = Fax1 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               Faxeff2 = Fax2 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               Faxeff3 = Fax3 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               Faxeff4 = Fax4 - str2double(Frdf);       % Berechnung der effektiven Axialkraft
               
               …
          case 3
               …
 
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: 28.01.2011, 10:14     Titel:
  Antworten mit Zitat      
Hallo,

mit dem Profiler kannst du analysieren, was deinen Code langsam macht.
Ich vermute, dass es die xlsread/xlswrite-Befehle sind, da bei jedem xlsread/xlswrite-Befehl die Datei im Grunde mit Excel geöffnet und wieder geschlossen wird (und wir wissen alle, wie lange das dauert. Du solltest daher versuchen, diese Befehle nach Möglichkeit zusammenzufassen, z.B. statt
Code:
xlswrite('Diagramme.xls', M1, 1, 'B2');
 xlswrite('Diagramme.xls', pmax_1, 1, 'C2');
 xlswrite('Diagramme.xls', M2, 1, 'D2');
 xlswrite('Diagramme.xls', pmax_2, 1, 'E2');
 xlswrite('Diagramme.xls', M3, 1, 'F2');
 xlswrite('Diagramme.xls', pmax_3, 1, 'G2');

könntest du
Code:
xlswrite('Diagramme.xls', [M1; pmax_1; M2; pmax_2; M3; pmax_3], 1, 'B2:G2')
schreiben.
Eine andere Frage wäre, ob die Daten jedes Mal nach Excel geschrieben / von dort geholt werden müssen. Zum Zwischenspeichern wären .mat-Dateien deutlich besser geeignet.
Wenn du die Daten nur innerhalb deines Programmes brauchst, sollten sie überhaupt nicht in Dateien geschrieben werden, sondern mit setappdata/getappdata mit den GUI-Elementen verknüpft werden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 28.01.2011, 10:39     Titel:
  Antworten mit Zitat      
Danke, für deine schnelle Antwort!

Deinen Vorschlag habe ich gleich ausprobiert, jedoch scheint sich da ein Fehler eingeschlichen zu haben. Da er nun alle Zellen von B2 bis G2 mit dem Wert "M1" überschreibt. Die anderen Werte (M2, pmax_2, usw.) werden nicht benutzt.
Ansonsten gefiele mir diese Lösung schon viel besser.

Wahrscheinlich gehts noch besser, aber dazu muss ich erstmal schildern wie das Programm arbeiten soll.
Das Schreiben und Lesen in und aus Excel können für den fähigen Programmierer sicher vermieden werden.

In Excel werden eigentlich nur die Daten vorbereitet, welche dann im Diagramm geplottet werden sollen. Leider bin ich unfähig dies gleich in Matlab aufzubereiten. Im Anhang habe ich mal ein Bild von der ExcelDatei angefügt.
Ist bestimmt ganz einfach, wenn man sich damit auskennt, denn jeder Plot hat eigentlich nur drei x-Werte und 3 y-werte.

Diagramm.jpg
 Beschreibung:
Vorbereitung des Diagramms

Download
 Dateiname:  Diagramm.jpg
 Dateigröße:  102 KB
 Heruntergeladen:  382 mal
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: 28.01.2011, 11:04     Titel:
  Antworten mit Zitat      
Hallo,

Hoppla, da hatte ich mal Zeilen und Spalten verwechselt. So gehts:
Code:
xlswrite('Diagramme.xls', [M1, pmax_1, M2, pmax_2, M3, pmax_3], 1, 'B2:G2')


Der Umgang mit .mat-Dateien ist eigentlich viel einfacher:
Daten speichern:
Code:
save('data.mat', 'M1', 'pmax_1', 'M2', 'pmax_2', 'M3', 'pmax_3')

Daten wieder laden:
Code:
load('data.mat', 'M1', 'pmax_1', 'M2', 'pmax_2', 'M3', 'pmax_3')


Wenn du die Datei am Anfang einmal vorbereiten musst, dann alle Variablen wie gewünscht definieren und dann wie oben speichern.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 28.01.2011, 11:33     Titel:
  Antworten mit Zitat      
Danke, danke, danke Smile
Schon wieder was gelernt.

Ich habe das Ganze hier:

Code:

xlswrite('Diagramme.xls', M1, 1, 'B2');
               xlswrite('Diagramme.xls', pmax_1, 1, 'C2');
               xlswrite('Diagramme.xls', M2, 1, 'D2');
               xlswrite('Diagramme.xls', pmax_2, 1, 'E2');
               xlswrite('Diagramme.xls', M3, 1, 'F2');
               xlswrite('Diagramme.xls', pmax_3, 1, 'G2');
               Dmom1 = xlsread('Diagramme.xls', 1, 'B1:B3');
               Dp1 = xlsread('Diagramme.xls', 1, 'C1:C3');
               Dmom2 = xlsread('Diagramme.xls', 1, 'D1:D3');
               Dp2 = xlsread('Diagramme.xls', 1, 'E1:E3');
               Dmom3 = xlsread('Diagramme.xls', 1, 'F1:F3');
               Dp3 = xlsread('Diagramme.xls', 1, 'G1:G3');
               
               xlswrite('Diagramme.xls', max_Mom, 1, 'T1');
               DmaxMom = xlsread('Diagramme.xls', 1, 'T1:T2');
               DpmaxMom = xlsread('Diagramme.xls', 1, 'U1:U2');
 


mittlerweile ersetzt durch:

Code:

               Dp1 = [0; pmax_1; pmax_1];
               Dmom1 = [1.1; M1; M1+200];
               Dp2 = [0; pmax_2; pmax_2];
               Dmom2 = [1.1; M2; M2+200];
               Dp3 = [0; pmax_3; pmax_3];
               Dmom3 = [1.1; M3; M3+200];
                                           
               DmaxMom = [max_Mom; max_Mom];
               DpmaxMom = [0; 15];
 


Man kann sich denken, wie viel Zeit gespart wird Wink
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.