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

Performance-Steigerung: Mittelwertbildung zu langsam

 

jens85
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2013, 08:57     Titel: Performance-Steigerung: Mittelwertbildung zu langsam
  Antworten mit Zitat      
Guten Morgen,

ich führe Teilentladungsmessungen (TE) durch und versuche gerade ein automatisches Auswertetool zu generieren.
Das Problem ist das es mehere Millionen Messwerte geben kann, je nach dem wie lange die Messungen laufen.
Ich bin in Matlab nicht gerade bewandert versuche aber immer mir die Lösungen selbst zu erarbeiten was man wahrscheinlich an dem Code sieht.
Vom Prinzip funktioniert die Mittelwertbildung aber wenn es in die 10taussende geht dauert der durchlauf Minuten bis Stunden.
Nun habe ich viel im Internet geforscht und bin auf die "Speicherallokation" gestoßen.

Im ersten Teil funktioniert dies auch sehr gut und es gehts schnell...

Code:

clear;
load Messwerte;
[m,n]=size(Messwerte);
% Speicher allokieren
PHneg= zeros(m,n);
PHpos= zeros(m,n);

% nach positiver und negativer Spannungshalbwelle trennen

for i=1:m  
    if   Messwerte(i,3)<0.5;
         PHneg(i,:)=Messwerte(i,:);
    else PHpos(i,:)=Messwerte(i,:);
         
    end;
end;

PHneg(PHneg(:,1)==0,:)=[];
PHpos(PHpos(:,1)==0,:)=[];

 


Hier kann ich die Speicherallokation glaube ich aber nicht anwenden da man ja keine festen Matrizen hat....
Code:

% Startwerte festlegen
[m,N]=size(PHneg);
meanPHneg=[0,0,0,0];
Vx=[];
meanZeit=60;    % Zeitbereich
k=0;
i=1;            
Zaehler=0;

while i<m-1

            % sucht alle TE im Zeitbereich und bildet Mittelwert
            % Zähler
  while     PHneg(i,1)>=meanZeit*k & PHneg(i,1)<meanZeit*(k+1);
            Vx(i,:)=PHneg(i,:);
            Vx(Vx(:,1)==0,:)=[];
            meanPHneg=mean(Vx);
            Zaehler=i;
            i=i+1;
  end;
            % auch wenn keine TE oder nur eine TE im Zeitbereich liegen
            % muss das erfasst werden deshalb das arbeiten mit k
 
            % ist für den Fall das in dem Zeitbereich keine TE
            n=size(Vx);
    if      isempty(Vx) ;
            A(k+1,:)=[meanZeit*k,0,0,0,0,0];
            k=k+1;
           
            % ist für den Fall das nur eine TE im Zeitbereich ist
            % geht ja net mit mean
    elseif  n(1)==1;
        n=size(Vx);
            Vx=[zeros(n(1),2) Vx];
            A(k+1,:)=Vx(1,:)
            A(k+1,1)=meanZeit*k;
            A(k+1,2)=1;
            k=k+1;
            Vx=[];
    else
            % erzeugt mir die Matrix mit Zeit, Anzahl und den Mittelwerten
            n=size(meanPHneg);
            meanPHneg=[zeros(n(1),2) meanPHneg];
            A(k+1,:)=meanPHneg(1,:);
            A(k+1,1)=meanZeit*k;        
            if k==0
                A(k+1,2)=Zaehler;
            else
                A(k+1,2)=Zaehler - sum(A(:,2));
            end;
            Vx=[];
            k=k+1;
    end;
           
    end;
 


Meine Frage ist wie kann der obere Code deutlich schneller gemacht werden? Geht das über Speicherallokation oder ist er allgemein viel zu umständlich geschrieben (da ich ja nur wenig Ahnung habe).

Würde mich über Hilfe sehr freuen, wenn ich alleine was verbessern kann werde ich das hier nat. posten.

danke
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, 09:43     Titel: Re: Performance-Steigerung: Mittelwertbildung zu langsam
  Antworten mit Zitat      
Hallo jens85,

Herzlich willkommen im Forum!

Ich nehme an "Speicherallokation" bedeutet "Pre-allocation".

Eine effizientere Methode im Matlab-Stil:
Code:
clear;
load Messwerte;
[m,n]=size(Messwerte);
index = Messwerte(:, 3)<0.5;
PHneg = Messwerte(index, :);
PHpos = Messwerte(~index, :);


Zitat:
Hier kann ich die Speicherallokation glaube ich aber nicht anwenden da man ja keine festen Matrizen hat....

Das wird mir nicht klar. Gibt es auch nicht-feste Matrizen?

Ich verstehe den Zweck der Programm-Abschnitte nicht vollständig. Darum ist es schwierig Verbesserungsvorschläge zu machen. Z.B.:
Code:
% sucht alle TE im Zeitbereich und bildet Mittelwert Zähler
while PHneg(i,1)>=meanZeit*k & PHneg(i,1)<meanZeit*(k+1);
  Vx(i,:)=PHneg(i,:);
  Vx(Vx(:,1)==0,:)=[];
  meanPHneg=mean(Vx);
  Zaehler=i;
  i=i+1;
end

"Zaehler" und "i" sind verwirren redundant. "meanPHneg" wird in jeder Iteration überschrieben, was natürlich viel Rechenzeit verschwendet. Wie wäre es mit:
Code:
% sucht alle TE im Zeitbereich und bildet Mittelwert Zähler
index = PHneg(:,1)>=meanZeit*k & PHneg(:,1)<meanZeit*(k+1);
Vx = PHneg(index, :);
Vx(Vx(:,1)==0, :)=[];
meanPHneg=mean(Vx);
Zaehler = sum(index);
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
jens85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2013, 10:33     Titel:
  Antworten mit Zitat      
Hallo Jan S,

erstmal herzlichen dank für die schnelle und gute Antwort.
Dein erster Codeblock geht deutlich schneller genau wie dein letzter. Das suchen mittels Index ist eine große Hilfe, werde ich mich mal näher mit beschäftigen.
Ich werde nun versuchen den Rest anzupassen so das alle Funktionen vorhanden sind und das Ergebnis nat. hier nochmal posten.

danke nochmal
Gruß Jens
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, 12:07     Titel:
  Antworten mit Zitat      
Hallo jens85,

Zitat:
Dein erster Codeblock geht deutlich schneller genau wie dein letzter.

Sie haben ja auch unterschiedliche Aufgaben.

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.