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

Matlab arbeitet zu langsam

 

kili12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.09.2013, 12:20     Titel: Matlab arbeitet zu langsam
  Antworten mit Zitat      
Hi Leute,
ich habe ein kleines Problem mit meinem Programm. Seitdem ich es in einzelne Funktionen verschachtelt habe (für die bessere Übersicht), läuft es nur noch extrem langsam. Ich glaube nicht, dass es an den Funktionen selber liegt, da es genauso langsam läuft wenn man den code aus den einzelnen Funktionen direkt in die Schleife kopiert. Woran kann es liegen das Matlab plötzlich solche Probleme hat? Ist es ggf. besser alle Variablen die ihren Wert ändern als Vektor anzulegen. Ich füg euch mal den schnellen und langsamen Code ein. (der langsame code ist schon etwas erweitert , was sich aber nicht auf die Geschwindigkeit ausgewirkt hat)

Code:
%schnell
clear all
%Speicher
A1=0.2;

Vsp=300;


 Aq=0.2;
 Lam=0.5562;
 h=0.4;

 
  wetter = xlsread('wetter4.xls');
  G=wetter(:,2)';
  Ta=wetter(:,1)';
 
  for zahl1=1:max(length(G))
  G(zahl1)=G(zahl1)/100;
  Ta(zahl1)=(Ta(zahl1)/100)+273;
  end
 
  zahl60=(length(G))*60;
  zahler=60;
  Gsec=[];
  Tasec=[];
  zahln=1;
  for zahl2=1:max(length(G))
 
      while zahln <= (zahler)
         
     Gsec(zahln)=G(zahl2);
     Tasec(zahln)=Ta(zahl2);
     zahln=zahln+1;
     
    end
    zahln;
    zahler=zahler+60;
  end


A=2.486;
k1=3.38;
k2=0.0166;
n0=0.85;
m=1.51;

cp=4200;
Tinstart=290;
Tinneu = Tinstart;
Tout =[283];
deltaT= [0];
Tsp = [290];
Toutsp =[290];
Tsps=290;
n=[];
Tabs=[];


 
for zahl = 1:  max(length(Gsec))
   
if Gsec(zahl) <= 100

 if zahl == 1
      Tabs(zahl)= Tsps;
      Tout(zahl)= Tsps;
 deltaT(zahl)=deltaT(zahl);
 Tinneu(zahl)=Tinneu(zahl);
 else
     
 Tout(zahl)= Tout(zahl-1);
     deltaT(zahl)=0;
 Tinneu(zahl)=Tinneu(zahl-1);
 end
else
    Tabs(zahl)=(Tinneu(zahl-1)+Tout(zahl-1))/2;
    n(zahl)=(n0-((k1.*(Tabs(zahl)-Tasec(zahl)))./Gsec(zahl))-(k2.*((Tabs(zahl)-Tasec(zahl)).^2)./Gsec(zahl)));
 
 deltaT(zahl) = (Gsec(zahl).* A.* n(zahl))./(cp .* m);

if zahl ~= 1
   % Tout
    if Gsec(zahl-1)<=100
        Tout(zahl)=Tout(zahl-1);
    else
   
Tout(zahl) = Toutsp(zahl-1) + deltaT(zahl);
    end
else
    Tout(zahl) = Tinstart + deltaT;

end

Tinneu(zahl)= Tout(zahl); %

end
if Gsec(zahl) >100
   
%Toutsp(zahl)=(-Tout(zahl)+2*Tsp(zahl-1)+2*(1/k3*A1)*m*cp*Tout(zahl))/(2*(1/k3*A1)*m*cp+1);%Qsp kontrollieren ggf. vorher schon def.
Toutsp(zahl)=(Tsp(zahl-1)*(1-exp((500*0.2)/(1.51*4200)))-Tout(zahl))/(1-exp((500*0.2)/(1.51*4200))-1);

Qdot(zahl)=m*cp*(Tout(zahl)-Toutsp(zahl));

Q=cumsum(Qdot);

Tsp(zahl)=(Q(zahl)/(Vsp*cp))+Tsps;

else
    Qdot(zahl)=0;
 
    if zahl~=1
    Tsp(zahl)=Tsp(zahl-1);
    Toutsp(zahl)=Tsp(zahl-1);
    else
        Tsp(zahl)=Tsps;
        Toutsp(zahl)=Tsp(zahl);
    end
end
end

plot (Tsp)


und der langsame:

Code:
clear all
%Daten Kollektor
A=2.286;
k1=3.38;
k2=0.0166;
n0=0.85;

%Daten Waermetauscher im Speicher
A1=0.2;
k3=300;

%Regelung
m=0.8;
dt=1;
minT=10;

%Fluid-Eigenschaften Kollektorkreislauf
cp=3800;

%Eigenschaften Speicher
cp1=4200;
V=300; %[l]

%Eigenschaften Rohrleitung
krohr=0.2;
La=1;
Li=8;
e=krohr/(m*cp);
Ti=295; %[K] Innentemperatur

%Startbedingungen
Tin=290;
Tabs=300;
Tout=[290 290];
Toutsave=0;
Tsps=290;
Tsp=[290 290];
Qdot=[];

 
 [E,Ta]= minutenwetterdaten;  
   


for t=1:dt: max(length(E))
   
    %Zuordnung der Zeit - Wetter (Einstrahlung, Aussentemperatur)
%     [Et,Tat]= wetter(t,dt,E,Ta);
   
    %Ausnahme fuer Einstrahlung = 0
    if E(t)==0
    Tout(t)=Tout(end);
    Tsp(t)=Tsp(end);
    else
    %Berechnung der Temperaturerhoehung im Kollektor
    [Tout,deltaT,Toutsave]= kollektor(t,dt,A,k1,k2,n0,cp,m,Tout,Tin,E,Ta,Toutsave);

    %Temperaturdifferenzregelung
     if Tout(t)-Tsp(end) <=minT;          
     Tout(t)=Tout(t);
     Tsp(t)=Tsp(end);    
     
     else
     
    %Berechnung der Rohrleitungsverluste (Kollektor-Speicher)
    [Tout,Toutsave]=rohrleitung1(La,Li,e,t, Ta,Ti, Tout);
   
    %Waermetauscher im Speicher
    [Tout] = wtspeicher(t,dt,cp,m,A1,k3,Tout,Tsps,Tsp);

    %Speicher
    [Tsp,Qdot] = speicher(t,dt,m,cp1,V,Tout,Tsps,Tsp,Toutsave,Qdot);
   
    %Berechnung der Rohrleitungsverluste (Kollektor-Speicher)
    [Tout,Toutsave]=rohrleitung2(La,Li,e,t, Ta,Ti, Tout);
    t
     end
     end
 end

plot(Tsp)
 


PS. Der Vektor für die Wetterdaten besteht aus Sekundendaten für einen ganzen Tag, also über 80000 Zeilen.


BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 04.09.2013, 13:32     Titel:
  Antworten mit Zitat      
Hallo kili,

das könnte unter anderem an dem fälschlich verwendeten "clear all" liegen.
Clear all sorgt dafür, dass er sich alle Funktionen aus dem Speicher löscht und diese neu von der Platte geladen werden müssen.

Viele Grüße
Chris
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.09.2013, 13:39     Titel:
  Antworten mit Zitat      
fehlende präallokation macht jede forschleife langsam Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
fekal
Forum-Century

Forum-Century



Beiträge: 124
Anmeldedatum: 08.02.11
Wohnort: Mainz
Version: 2017b
     Beitrag Verfasst am: 04.09.2013, 14:38     Titel:
  Antworten mit Zitat      
Wenn du mehrere Kerne hast kannst du versuchen mit
Code:
anstatt mit
Code:
zu arbeiten.
Vorher musst du aber die Kerne mit
Code:
matlabpool
aktivieren.

Du muesstest dann auch deinen forschleifen Zaehlbereich
Code:
anpassen.
(a:b:c geht nicht nur a:b)

Das ist natuerlich nur Flickschusterrei. Wenn es aber nur an der for-Schleife liegt kann das die Zeit schonmal verkuerzen.

beste Gruesse
fekal
Private Nachricht senden Benutzer-Profile anzeigen
 
kili12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.09.2013, 22:46     Titel:
  Antworten mit Zitat      
Also schon mal vielen Dank für Eure Anworten.

An dem "clear all" liegt es nicht.

Was sind bzw. was ist denn bitte "präallokation "?

Das mit der Parfor-Schleife werde ich mal ausprobieren, allerdings habe ich festgestellt, wenn man einen Zähler mitlaufen lässt, dass die ersten 30000 Durchläufe super schnell sind, dann Matlab aber bis zum (ungefähr) 50000. Lauf immer langsamer wird, bis Matlab dann die letzten 30000 Durchläufe wieder in einem Schwung nimmt. Also mir kommt es so vor als ob Matlab erstmal (nach einer bestimmten Anzahl von Durchläufen) wieder Platz schaffen muss um dann (kurzzeitig) wieder schneller zu sein. Gibt es vielleicht eine Möglichkeit den Speicher zwischenzeitlich von unötigen Platzhaltern (welche wären das?) zu befreien oder das ganze durch richtige/andere Deklaration von Variablen zu umgehen?

Viele Grüße
Kili
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.09.2013, 22:55     Titel:
  Antworten mit Zitat      
hmm wenn man prä allokation googelt ist es leider nur der 2. anschlag. darum wahrscheinlich für die meisten nicht auffindbar
http://www.mathworks.de/support/solutions/en/data/1-18150/
prä allokation ist eine vorraussetzung für jede for schleife in der array elemente einzeln berechnet werden.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 05.09.2013, 09:33     Titel:
  Antworten mit Zitat      
Sorry für OT,

Zitat:
hmm wenn man prä allokation googelt ist es leider nur der 2. anschlag. darum wahrscheinlich für die meisten nicht auffindbar

Danke Winkow, gleich mal ein Lacher fürs Büro am Morgen Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
kili12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2013, 11:21     Titel:
  Antworten mit Zitat      
Hmm also ich hab das mal folgendermaßen probiert:

Code:
%Startbedingungen
Tin=290;
Tabs=300;
Tout=zeros (1,86400);
Tout(1)=290;
 Tsp=zeros (1,86400);
Tsp(1)=290;
Toutsave=0;

Tsps=290;

Qdot=zeros (1,86400);


leider wird Matlab dadurch noch mal wesentlich langsamer, als ohne Präallokation. Habe ich was falsch gemacht oder liegt der Hase doch irgendwo anders im Pfeffer?
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.09.2013, 11:26     Titel:
  Antworten mit Zitat      
nunja deine schleife ruft recht viele unbekante funktionen auf kein plan was da gemacht wird oder was da noch so alles schief läuft ^^ in deinem oberen code berechnest du immer nur ein tout. in deiner schleife hingegen rufst du deine funktionen zb mit allen 86000 elementen von tout auf.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kili12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2013, 11:46     Titel:
  Antworten mit Zitat      
ja das würde auch erklären warum matlab mit prä allokation noch langsamer wird, da von anfang an mit 86400 werten gearbeitet wird und das problem eher in dieser richtung liegt,.... mit prä allokation sind die ersten 20000 durchläufe noch schnell und ohne die ersten 30000. naja wie auch immer, ich werd noch mal etwas rumprobieren,..... trotzdem danke
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.09.2013, 11:52     Titel:
  Antworten mit Zitat      
prä allokation ist bei jeder for schleife wichtig. es siht aber so aus als wären deine unterfunktionen nicht gut geschrieben Smile wenn sie mit allen elementen arbeiten sollen dann gehören sie eigentlich nicht in die for schleife da es nach einer vektorisierten lösung aussiht. wenn sie aber nur mit einem elemt arbeiten dann darfst du ihnen auch nur das eine element übergeben.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 11.09.2013, 13:58     Titel:
  Antworten mit Zitat      
Schnelleren Rechner nehmen?
Code:
nutzen?
Datenbeispiel mitliefern?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
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: 11.09.2013, 16:37     Titel: Re: Matlab arbeitet zu langsam
  Antworten mit Zitat      
Hallo kili12,

Ich kann den Code kaum lesen. Zunächst würde ich alles auswählen und per Strg-I eine saubere Code-Indentation durchführen. Spaces sind dabei besser als Tabs.

Im nächsten Schritt ist der bereits empfohlene Profiler wärmstens zu empfehlen, da er die zeitfreesenden Code-Teile ermitteln kann. Es lohnt sich nicht eine Minute Zeit in die Optimierung einer Zeile zu stecken, die nur 0.01 Sekunden Laufzeit hat. Eine Laufzeitoptimierung ist immer nur am zeitaufwendigsten Teil effizient und wirksam.

Den Code könnte man auch nioch etwas aufräumen, z.B.:
Code:

"length(G)" gibt einen skalaren Wert zurück, das max() kann man sich dann sparen.
Man kann aber auch gleich die ganze Schleife weglassen und schreiben:
Code:
G = G / 100;
Ta= Ta / 100 + 273;

Die Variablennamen zahl1, zahl60, zahler, zahl2, zahln, zahl sind schlicht verwirrend. Ich halte es für kaum möglich, in dem Dickicht nach Bugs zu suchen. Ich würde deshalb den ganzen Code nochmal schreiben und versuchen eine einfache und klare Methode für die Namen zu verwenden.

Über prä-allokation erfährt man mehr, wenn man Google nach dem Englischen "pre-allocation Matlab" fragt.

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.