Verfasst am: 11.09.2013, 08:57
Titel: Performance-Steigerung: Mittelwertbildung zu langsam
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...
% 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);
ifisempty(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;
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.
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);
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.
Dein erster Codeblock geht deutlich schneller genau wie dein letzter.
Sie haben ja auch unterschiedliche Aufgaben.
Gruß, Jan
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.