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

Code schneller machen

 

Florre
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 28.02.2013, 16:24     Titel: Code schneller machen
  Antworten mit Zitat      
Hallo Ich hab da ein kleines Problem,
da ich große Datenmengen verarbeiten muss würd ich meinen Programm code schneller machen. Leider weiß ich nicht genau wie. Könnt Ihr mir vlt. helfen.

Code:
 clear all
close all                                                                  


link='C:\Benutzer\Florre\Desktop\Strömung\Test\Auswertung';                 %Eingabe Arbeitsverzeichnis/Auszuführende Datei

dateien=uigetdir('',link);                                                  %Verzeichnis der Dateien durch eingabe des Benutzer bekommen
cd(dateien);                                                                %Dateien Auslesen
[stat,Text]=fileattrib('*.txt');                                            
names={Text.Name};                                                          %Die Namen der Dateien in eine "Tabelle" speichern wichtig für die Auswertung

x=1;                                                                        
while(1)
       File=names{x};  %Dateien einzeln nehmen
    comma2point(File)  %extra Funktion aus dem I-net gefischt und verändert Ersetzt die Kommas durch Punkte MATLAB braucht Punkte
    Einlesen=dlmread(File,'\t',8,0);     %Da die Dateien Einen Text Kopf und auch die Spalten Text enthalten und MATLAB nicht viel damit anfagen kann werden sie Rausgefilter (Nicht eingelesen)  
    Einlesen(:,6)=Einlesen(:,2).*Einlesen(:,3);      
    Einlesen(:,7)=Einlesen(:,4).*Einlesen(:,5);      
   
    y=2;                                                                    
 S1(1)=0;     while(1)
       S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2);  
 y=y+1;
       if ((y+1)>length(Einlesen(:,6))) ,break,end    
    end
    Sa(1)=0;                                                              
    g=2;
        while(1)
        Sa(g)=Sa(g-1)+S1(g);
        g=g+1;
        if ((g)>length(S1)) ,break,end
        end
         
   S2(1)=0;
   y=2;
        while(1)
        S2(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,7)+Einlesen(y,7))/2);
        y=y+1;
        if ((y+1)>length(Einlesen(:,6))) ,break,end
        end
   Sb(1)=0;
   g=2;
        while(1)
        Sb(g)=Sb(g-1)+S2(g);
        g=g+1;
        if ((g)>length(S2)) ,break,end
        end
     
         M=Sb./Sa;                                                        
    Einlesen(:,9)=Sb;
    Einlesen(:,8)=Sa;
    Einlesen(:,10)=M;                                                      
   
    dlmwrite('Test.txt',Einlesen,'delimiter', '\t');                
            x=x+1;
  if (x>length(names)) ,break,end
end
 


Ich weiß das man in Schleifen wenn der Vektor immer größer wird vorher die größe festlegen sollte. Da meine Datein aus übert 150.000 Zeilen besteht meckert mein Matlab rum und sagt mir out off Memory.

Habt Ihr noch irgendwelche Ideen??

Danke im Vorraus..

LG Florre
Private Nachricht senden Benutzer-Profile anzeigen


Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 09:14     Titel:
  Antworten mit Zitat      
Hallo, hab mal noch eine Beispieldatei mit hoch geladen.

ist aber stark verkürzt.


Lg Florre

Druck_131.txt
 Beschreibung:

Download
 Dateiname:  Druck_131.txt
 Dateigröße:  2.85 KB
 Heruntergeladen:  268 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 01.03.2013, 09:40     Titel:
  Antworten mit Zitat      
Es sind also zwei verschiedene Themen, die aber schon zusammen hängen können. Speicher und Performance.

Um welches Release habdelt es sich denn auf welchem Betriebssystem und ist MATLAB und auch diese Maschine 64 Bit?

Schon Mal den Profiler benutzt um zu sehen wo der Flaschenhals ist?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 09:50     Titel:
  Antworten mit Zitat      
Hallo
Profiler hab ich noch nicht gemacht werd ich gleich mal machen.
MATLAB version: R2009a (7.8.0) 64bit
Windows 7 64 bit da läuft Matlab

Lg Florre
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 10:01     Titel:
  Antworten mit Zitat      
So hab das mal gemacht...
Hab mir schon gedacht das das so lange dauert und wo die Flaschenhälse sind hab aber keine Ahnung was ich ändern kann..

Code:

 time   calls  line
  0.05       1    1 clear all
  0.03       1    2 close all                                                                
             1    3 clc
             1    4 format('longg');                                                          
                  5
             1    6 link='C:\Benutzer\Florre\Desktop\Strömung\Test\hu';                          
                  7
 14.48       1    8 dateien=uigetdir('',link);                                                  
             1    9 cd(dateien);                                                              
  0.02       1   10 [stat,Text]=fileattrib('*.txt');                                          
             1   11 names={Text.Name};                                                          
                 12
  0.02       1   13 x=1;                                                                        
             1   14 while(1)
             1   15        File=names{x};                                                      
  0.30       1   16     comma2point(File)                                                      
  1.39       1   17     Einlesen=dlmread(File,'\t',8,0);                                      
             1   18     Einlesen(:,4)=Einlesen(:,4).*1000;
             1   19     Einlesen(:,6)=Einlesen(:,2).*Einlesen(:,3);                              
             1   20     Einlesen(:,7)=Einlesen(:,4).*Einlesen(:,5);                              
                 21    
                 22    
                 23    
             1   24     y=2;                                                                    
             1   25     S1(1)=0;                                                              
             1   26     while(1)
 31.89  104998   27        S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2);  
  0.11  104998   28        y=y+1;
 27.51  104998   29        if ((y+1)>length(Einlesen(:,6))) ,break,end                          
  0.16  104997   30     end
             1   31     Sa(1)=0;                                                              
             1   32     g=2;
             1   33         while(1)
 31.48  104998   34         Sa(g)=Sa(g-1)+S1(g);
  0.02  104998   35         g=g+1;
  0.02  104998   36         if ((g)>length(S1)) ,break,end
  0.03  104997   37         end
             1   38       Sa(g)=Sa(g-1);  
                 39      
                 40    
             1   41    S2(1)=0;
             1   42    y=2;
             1   43         while(1)
 32.59  104998   44         S2(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,7)+Einlesen(y,7))/2);
  0.06  104998   45         y=y+1;
 26.61  104998   46         if ((y+1)>length(Einlesen(:,6))) ,break,end
  0.25  104997   47         end
             1   48    Sb(1)=0;
             1   49    g=2;
             1   50         while(1)
 31.81  104998   51         Sb(g)=Sb(g-1)+S2(g);
  0.02  104998   52         g=g+1;
  0.03  104998   53         if ((g)>length(S2)) ,break,end
        104997   54         end
             1   55     Sb(g)=Sb(g-1);
                 56    
                 57    
             1   58          M=Sb./Sa;                                                          
  0.02       1   59     Einlesen(:,8)=Sa';
             1   60     Einlesen(:,9)=Sb';
  0.02       1   61   Einlesen(:,10)=M';                                                      
                 62    
                 63    
                 64    
             1   65      nummerbild=sprintf('%s%s',names{x},'_neu.txt');
  8.30       1   66     dlmwrite(nummerbild,Einlesen,'delimiter', '\t');                
             1   67             x=x+1;
             1   68   if (x>length(names)) ,break,end
                 69 end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 01.03.2013, 10:34     Titel:
  Antworten mit Zitat      
Also die while Schleifen sowie die Bedingungen mit dem break würde ich eher in ne FOR schleife umwandeln:

Code:
for idx = 2 : size(Einlesen,1)
end


da solche Sachen mit break nicht ganz so sauber sind aber davon mal abgesehen. Eventuell mal die Schleifen versuchen umzuschreiben:

Code:
S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2);  


zu so etwas vlt. :

Code:
S1 = diff(Einlesen(:,1)).*(Einlesen(1:end-1,6)+Einlesen(2:end),6)/2;


Dann bekommst du einen Vektor raus, dies dann für die anderen auch so machen und du könntest dir schon mal die while Schleifen ersparen.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 11:12     Titel:
  Antworten mit Zitat      
soweit so gut aber wie bekomm ich das denn hin das am anfang eine 0 ist?? also praktisch

Code:


Aber vlt. mal anders. Das soll ja eigentlich nen Integral sein.. hab leider nicht die entsprechende Toolbox

Code:

 y=2;                                                                    
 S1(1)=0;                                                              
while(1)
S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2);  
y=y+1;
if ((y+1)>length(Einlesen(:,6))) ,break,end                          
end
Sa(1)=0;                                                              
g=2;
while(1)
 Sa(g)=Sa(g-1)+S1(g);
g=g+1;
if ((g)>length(S1)) ,break,end
end
Sa(g)=Sa(g-1);  
 

Das stellt ja so gesehen mein Integral da.
In der Ersten Schleife berechne ich die einzelnen abschnitte und in der zweiten Schleife Summiere ich sie auf.
Brauche halt den Verlauf des Integrals....
aber hab deines mal getestet funktioniert nur das die Klammer setzung nicht ganz richtig war
Code:
S1 = diff(Einlesen(:,1)).*(Einlesen(1:end-1,6)+Einlesen(2:end),6)/2;

richtig ist aber glaub ich
Code:
S1 = diff(Einlesen(:,1)).*(Einlesen(1:end-1,6)+Einlesen(2:end,6))/2;

Aber irgendwie spuckt die Formel andere Ergebnisse aus als meine Schleife...
Lg Florre

Zuletzt bearbeitet von Florre am 01.03.2013, 11:27, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 01.03.2013, 11:23     Titel:
  Antworten mit Zitat      
Stimmt, da hat sich eine Klammer rein geschlichen Wink

Zu deiner Frage mit S1 = 0 :

Code:
S1 = [0; S1] %falls Spaltenvektor
S1 = [0 S1] % falls Zeilenvektor
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 01.03.2013, 11:32     Titel:
  Antworten mit Zitat      
Also ich hab es jetzt mit deinem Ansatz probiert und dann mit folgendem Code:

Code:
S1 = diff(Einlesen(:,1)).*(Einlesen(1:end-1,6)+Einlesen(2:end,6))/2;
S1 = [0; S1];



und ich komme auf das gleiche Ergebnis.
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: 01.03.2013, 11:38     Titel:
  Antworten mit Zitat      
Hallo Florre,

Zunächst würde ich auf alle Fälle das sinnlose "clear all" weglassen. Es ist ein ausgesprochener Nachteil auch alle geladenen Funktionen aus dem Speicher zu löschen, weil das Nachladen von der Festplatte zeitraubend ist. Welchen Zweck soll das haben? Es ist zwar unheimlich häufig zu Beginn von Programmen zu finden, trotzdem ist es nicht nützlich.

Die WHILE-Schleifen haben zwei ernste Bremser: 1. ist FOR hier wirklich schneller, 2. sind die Ausgaben nicht pre-alloziert. Das schrittweise Vergrößern eines Arrays ist aber sehr teuer.

Code:
S1 = zeros(1, size(Einlesen, 1));  % Pre-allocation!!!
for y = 2:size(Einlesen, 1)
  S1(y) = (Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6)) * 0.5);  
end

Hier kann Matlabs JIT-Accelerator den Code deutlich beschleunigen, wenn dies in einer Funktion steht, und nicht in einem Script.

Eine Vektorisierung hilft ebenfalls:
Code:
n = size(Einlesen, 1);
S1 = [0, (diff(Einlesen(:, 1)) .* (Einlesen(1:n-1,6) + Einlesen(2:n, 6)) * 0.5];

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.03.2013, 11:44     Titel:
  Antworten mit Zitat      
Hallo zusammen,

was ist dieses JIT-Accelerator und wie kann man benutzerdefinierte Blöcke für den Profiler definieren?

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 11:50     Titel:
  Antworten mit Zitat      
Ok dann steh ich auf den Schlauch...

Ich hab jetzt einfach mal

Code:

y=2;                                                                    
 S1(1)=0;                                                              
while(1)
S1(y)=(Einlesen(y,1)-Einlesen(y-1,1))*((Einlesen(y-1,6)+Einlesen(y,6))/2);  
y=y+1;
if ((y+1)>length(Einlesen(:,6))) ,break,end                          
end
 

mit
Code:
Sg = diff(Einlesen(:,1)).*(Einlesen(1:end-1,6)+Einlesen(2:end,6))/2;

verglichen aber irgendwie...
S1(2)=8,649e-08
Sg(1)=1,3112e-07
für die Werte das ist ne andere Datei als die ich hochgeladen hab..
Private Nachricht senden Benutzer-Profile anzeigen
 
Florre
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 11:55     Titel:
  Antworten mit Zitat      
Hallo Jan das mit den
Code:
S1 = zeros(1, size(Einlesen, 1));  % Pre-allocation!!!
 

komisch als ich das erste mal gemacht habe hat er mir gesagzt out off Memmory jetzt geht es scheinbar...
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: 01.03.2013, 11:57     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht hattest du die erste 1 vergessen.
Dann wird eine quadratische Matrix erzeugt, und das wird bei 100000 Zeilen und 100000 Spalten dann schwierig.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 28.02.13
Wohnort: ---
Version: R2009a, R2016b
     Beitrag Verfasst am: 01.03.2013, 12:18     Titel:
  Antworten mit Zitat      
So hab das jetzt mit den

Code:
S1 = zeros(1, size(Einlesen, 1));  % Pre-allocation!!!
 

gemacht und noch mal Profiler durchlaufen lassen..

vor dieser kleinen Änderung hat mein Programm ganze 254sec. gebraucht jetzt ist es bei 65 sec.

Danke Schon mal...
Jetzt will ich noch die While schleifen raus werfen und dann mal gucken melde mich dann wieder. bis dahin

Lg Florre
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.