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/if Schlefien "wegoptimieren"?

 

luna
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 14.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2010, 15:14     Titel: for/if Schlefien "wegoptimieren"?
  Antworten mit Zitat      
Hallo zusammen,
ich hänge an einem typischen Matlab Problem. Ich habe jetzt mein Progrämmchen nach bestem Wissen fertig geschrieben. Bei dem Programm geht es um zwei Sprungfunkionen L und J zwischen die immer eine Ausgleichsfunktion mit tanh. hineingelegt werden soll. Das funktioniert auch alles toll und ich bekomme eine superschöne kurve. Jetzt habe ich meine (etwas größeren) Werte eingespeist, und der PC rechnet sich tot. OK, verständlich sind auch nen Haufen Schleifen drin. Kleinere Sachen in anderen Programmen konnte ich bereits vektorisieren, allerdings kann ich das nicht, wenn ich eine umfassende for- schleife habe in der noch drei if schleifen laufen...
hab ihr hier irgend einen tipp? bin echt aufgeschmissen...
hier mal mein code, hab versucht alles so gut wie möglich zu kommentieren:
Code:

J=[hj,j];
L=[hl,l];




n=length(hj);
diffmaxarray=zeros(size(hj),1)
distancemaxarray=zeros(size(hj),1) % vorgeben der Matrixlänge mit Nullmatrix um Rechenzeit zu sparen
Wendepunkt=zeros(size(hj),1)

distance=0 % setzt distance gleich null bevor neue Distance ermittelt wird
counter =0
difference=0
k=1 %Zähler für differencemax
p=1 %Zähler für distancemax
LaengeMatrix = zeros(size(hj),6) % Nullmatrix mit Länge h und 6 Spalten, in der Informationen gespeichert werden
for i=1:n %läuft über alle Daten
 
    if  L(i,2)~= J(i,2)  
        distance=distance+1 % distance wird hochgezählt, sobald die beiden Werte unterschiedlich sind
        LaengeMatrix(i,1)=i
        LaengeMatrix(i,2)=distance % distance gibt es nur wenn funktionen verschiede
        LaengeMatrix(i,3)=J(i,2)-L(i,2) % differenz in y-achsen richtung
        counter=0
    else
         LaengeMatrix(i,1)=i
        LaengeMatrix(i,3)=J(i,2)
        counter =1 % sind die werte gleich wird der counter auf eins gesetzt    
    end
   
    if  ((distance > 0) && (counter> 0)) %obere(rechte) Grenze bestimmt also Länge in X endpunkt                                  
        distancemax =distance %auslesen
        distancemaxarray(p,1)=distancemax % neuer Zähler p um die verschiedenen x-Längen zuzuordnen
        p=p+1
        distance=0
        counter =0  % distance und counter auf Null setzen um ein neues Zählen zu ermöglichen
        differencemax =J(i-1,2)-L(i-1,2)%Punkt unmittelbar bevor beide Funktionen wieder zusammentreffen
        diffmaxarray(k,1)= differencemax % hier wird Länge des Intervalls in y-bestimmt
        k=k+1
    end
   
   
   
end
 
k=1
p=1
w=1
for i=1:n

    Wendepunkt(p,1)=distancemaxarray(p,1)./2  % hier wird Wnedepunkt in der mitte des x-Intervalls bestimmt
 
   if L(i,2)~= J(i,2)
       
       if LaengeMatrix(i,2)==Wendepunkt(p,1)
          LaengeMatrix(i,6)=0
       else
         
           LaengeMatrix(i,6)= -Wendepunkt(p,1)+w
            %wendepunkt bestimmt und gleich null gesetzt, Werte nehmen nach
            %"links" ab nach "rechts" zu
       end
       w=w+1
   else LaengeMatrix(i,6)=0                
         w=1        
   end
 
end
     
 p=1
for i=1:n
   if L(i,2)~= J(i,2)
      m(i,1)=(diffmaxarray(k,1)./2).*(tanh((10./distancemaxarray(p,1).*(LaengeMatrix(i,6)))))+J(i,2)-(diffmaxarray(k,1)./2)%+ L(p,2)%tanh((10./distancemaxarray(p,1))) %l(k,1)%+ diffmaxarray(k,1)%.*(tanh(distancemaxarray(p,1)./2))
         
             if (distancemaxarray(p,1)==LaengeMatrix(i,2))
                p=p+1
                k=k+1 % hier wirdn die funktion gezeichnet, m ist die Funktionsgleichung
             end    
   
    else m(i,1)= J(i,2)
    end

end

hold on
plot(L(:,1),L(:,2),'g')

plot(J(:,1),J(:,2),'r')
plot(hj,m,'b')
hold off
 

Wäre Euch supersuper dankbar wenn sich jemand die Mühe macht, das mal durchzugucken und drüber"zuhirnen"
10000 Dank, luna
Private Nachricht senden Benutzer-Profile anzeigen


backspin
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2010, 19:37     Titel:
  Antworten mit Zitat      
Hallo,

also wenn das der Originalcode ist, dann ist Matlab weniger mit der Rechnung als vielmehr mit der Ausgabe der ganzen Variablen beschäftigt. Insofern ist die Frage, ob hier der Code in Richtung Schleifen optimiert werden muß...
Also probiere es erstmal mit Semikolons!
Ach ja nur so am Rande in Richtung Code-Optimierung, i und j als Zählvariablen vermeiden!

mfG
Backspin
Private Nachricht senden Benutzer-Profile anzeigen
 
luna
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 14.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2010, 09:29     Titel:
  Antworten mit Zitat      
Ja, danke für die Antwort!!!
Ich habe mir auch gedacht, ich räum mal das Progrämmchen auf und mach überall Semikolons hin: Und siehe da, es war sauschnell!!!

Hab des echt voll verrafft, weil ich mir vorher immer die Ausgabe nebenher angeschaut hab, um zu checken ob das Programm auch das tut was ich will!

Ja, mit i und j hast Du recht. Da muss ich nochmal ran.

Danke,

luna
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.