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