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

for Schleife Vektorisieren

 

xel
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 15:15     Titel: for Schleife Vektorisieren
  Antworten mit Zitat      
Guten Tag

Ich hätte da mal ein Problem.
ich habe gehört das eine for- Schleife oft nicht die eleganteste Lösung ist und wollte fragen ob man die for- Schleife in meinem Programm Vektorisieren kann ( wenn das so heißt) , nur weiß ich nicht wie das funktioniert. Ich wäre dankbar wenn mir jemand helfen könnte..

Code:

function U = fcn(w,x,time,law,t)
x_soll=70;
a=0.5831;
b=0.8487e-3;

i=1;
n=6;
t=0.01;

E=[2 0;0 0.3];

u=(a*w)/(b*x+t);    %   z.B. x= 70.45   (kann beliebige Werte annehmen)

sigma=[u;w];    % z.B. sigma=[2.033;0.85]  (kann beliebige Werte annehmen)

Z=zeros(6,1);
M=zeros(6,1);

for i=1:n
   
    Ki_R=[-1.3254 -1.9532 -2.5577 -0.8284 -1.2207 -1.5985];
    wi_R=[0.0248 0.0253 0.0257 0.0248 0.0253 0.0257];
   
    P=[4 6 8 4 6 8;0.5 0.5 0.5 0.8 0.8 0.8];
    u_Ri=[4 6 8 4 6 8];
   
    Z(i)=((exp(-((norm(E*(sigma-P(:,i))))^2)))*(u_Ri(i)+Ki_R(i)*(x_soll-x)+Ki_R(i)*wi_R(i)*(x_soll-x+(law)*Ki_R(i))*time));    %  z.B. law=0.54 ( kann beliebige Werte annehmen )
   
    M(i)=(exp(-((norm(E*(sigma-P(:,i))))^2)));
           
end

z=sum(Z);
m=sum(M);

U=z/m




Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.11.2011, 16:50     Titel:
  Antworten mit Zitat      
Hallo,

auf den ersten Blick würde ich sagen, dass das schwierig wird, da du eine Vektornorm bildest und das nicht direkt auf Matrizen übertragbar ist. Du müsstest wohl die Aufrufe von NORM auflösen und deinen Code etwas anpassen; die Frage ist aber, ob das die Mühe wert ist.

Vektorisierung ist nämlich vor allem dann interessant, wenn Code sehr lange braucht und die Zeit in for-Schleifen verbracht wird. Dann lässt sich oftmals ein Faktor 10 gewinnen. In deinem Fall kann ich mir das nur vorstellen, wenn du diese Funktion extrem oft aufrufst.

Vorschläge:
- überflüssige Klammern vermeiden; das erschwert das Lesen des Codes.
- Unveränderte Parameter (Ki_R, wi_R etc.) außerhalb der for-Schleife definieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
xel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 17:18     Titel:
  Antworten mit Zitat      
Vielen Dank schon mal.

Ich habe das Programm jetzt mal ein wenig verändert, so dass die NORM-Bildung nicht mehr vorkommt. Wäre es nun möglich?

Ich denke das die Berechnungszeit für die Anwendung akzeptabel ist, dennoch würde es mich interessieren, wie man dies umsetzt (Vektorisieren)

Code:


.
.
.

for i=1:n
       
   
    n0=E*(sigma-P(:,i));
    n1=n0(1)^2+n0(2)^2;
   
    Z(i)=exp(-n1)*(u_Ri(i)+Ki_R(i)*X+Ki_R(i)*wi_R(i)*(X+law/Ki_R(i))*time);
   
    M(i)=exp(-(n1));
   
end

z=sum(Z);
m=sum(M);

U=z/m;


Gruß Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.11.2011, 20:43     Titel:
  Antworten mit Zitat      
Halllo xel,

Ich würde diese Schleife immer noch nicht vektorisieren. Die teuerste Funktion daran ist nämlich EXP, und daran ändert sich nichts, wenn man das auf eine Matrix anwendet.
Stattdessen würde ich weiter alle wiederholten Berechnungen vermeiden:
Code:

for i=1:n
    n0 = E * (sigma - P(:,i));
    n1 = n0(1) * n0(1) + n0(2) * n0(2);  % Potenzieren ist teurer als multiplizieren
    M(i) = exp(-n1);
    Z(i) = M(i) * (u_Ri(i) + Ki_R(i) * (X + wi_R(i) * (X + law / Ki_R(i))) * time);
end

z = sum(Z);
m = sum(M);
U = z / m;

Ich habe bei der Berechnung von Z(i) eine Mutliplikation gespart und nur ein EXP pro Iteration verwendet. Kannst Du per TIC/TOC ein paar Timings machen?

Vektorisieren ist kein Zaubermittel. Es verlangsamt das Programm sogar, wenn das Allocieren der temporären Arrays viel Zeit benötigt. Zudem ist es niemals sinnvoll 30 Minuten in die Optimierung eines Programmteils zu stecken, dass nur wenige Sekunden Rechenzeit benötigen wird.

Gruß, Jan

Gruß, Jan
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.