Mittelwerte aus Matrix in 50er- bzw. 100er Schritten
FrLUR
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.10.2015, 17:35
Titel: Mittelwerte aus Matrix in 50er- bzw. 100er Schritten
Hallo,
folgende Problematik. Ich habe insgesamt 12 Messreihen mit jeweils um die 130 000 Messwerten, verpackt in drei Matrizen (z.B. 1x45000). Aus diesen drei Matrizen ermittel ich dan Punkte, die ich nacheinander plotte, um einen Verlauf zu zeigen.
Nicht nur, dass der Plot meine Rechnerleistung strapaziert, es dauert auch zu lang. Daher möchte ich aus den 1X45000 Matrizen Mittelwerte bilden in 50er bzw. 100er Schritten. Und das möglichst so allgemein, dass ich auch andere Matrizengrößen verarbeiten kann.
Der entsprechende Code-Abschnitt:
Code:
a = 0.3675;
b = 0.4265;
c = 0.7985;
F_a = [cell2mat(C(1,2)); cell2mat(C(1,6))];
F_a(isnan(F_a))=[]; % alle NAN raus
F_b = [cell2mat(C(1,3));cell2mat(C(1,7))];
F_b(isnan(F_b))=[];
F_c = [cell2mat(C(1,4));cell2mat(C(1,8))];
F_c(isnan(F_c))=[];
Zuvor lade ich die Daten aus einer csv, im Anschluss läuft der Plot mit r_Ry und r_Rx. Die Datei, die ich akutell bearbeite umfasst in der Summe 47039 Punkte.
um dann mit mean die Mittelwerte Spaltenweise zu ermitteln und in eine neue Matrix zu schreiben. Leider berhalte ich die Fehlermeldung:
Product of known dimensions, 50, not divisible into total number of elements, 47039.
Im Prinzip ist mir egal, ob der letzte Mittelwert aus 50 oder 39 Einzelwerten bestimmt wird. Kann ich den Befehl irgendwie so erweitern, dass die letzte Spalte den Rest enthält? Oder braucht es da eine ganz andere Herangehensweise?
Verfasst am: 26.10.2015, 18:46
Titel: Re: Mittelwerte aus Matrix in 50er- bzw. 100er Schritten
Hallo FrLUR,
Wenn Dein Code zu langsam ist, hast Du schon den Profiler verwendet um den Flaschenhals zu finden? Vielleicht fehlt ja nur eine pre-allocation.
Wenn du blockweiose Mittelwerte bilden möchtest, ein einfaches
reshape
aber daran scheitert, dass die Länge des Arrays kein Vielfaches der Block-Größe ist, liegt die Lösung sehr nahe:
Code:
siz = size(r_Ry);
winSize = 50;
M = siz(1) - mod(siz(1), winSize);
r_Ry = mean(reshape(r_Ry(1:M), winSize, []), 1);
erst mal Danke für Deine Antwort. Ich habe heute mal ein bißchen mit Deinen Vorschlägen rumprobiert.
Dein Code funktioniert sehr gut, danke dafür. Die Anzahl der Punkte wird auf unter 1000 reduziert, was auch noch mit dem Büro-Rechner halbwegs verträglich ist.
Leider habe ich nun Probleme mit der avi-File, die aufgrund eines Fehlers nicht abgespielt werden kann. Warum auch immer. Mir "gefällt" jedoch auch die gemittelte Version nicht. Sie ist zu stark geglättet, auch wenn der Trend noch stimmt. Möglicherweise sind 50 Werte auch zu viel und das müsste reduziert werden auf maximal 10.
reduce_plot bringt leider nicht viel. Möglicherweise sind die Messwerte zu dicht beieinander, jedenfalls hab ich den Plot nach einer Weile beendet. Man sieht leider auch nicht, wie viele Werte tatsächlich aussortiert werden.
Bei einer Datenmenge von 47000 Punkten läuft der Plot mit der Programmierung (s.u.) insgesamt knapp 40 Minuten. Ich kann eventuell noch etwas schneller werden mit der Abfolge, aber irgendwann sieht man die einzelnen Punkte nicht mehr.
Damit ich größere Datenmenge verarbeiten kann, habe ich dann Deinen Vorschlag mit dem Profiler verfolgt. Zunächst der Code:
Code:
set(figure,'Name','Plot 1', 'Position',[10,100,1400,800]); % Beschriftet das Plot Fenster mit Plot 1 und legt Größe des Fensters fest set(gca, 'Fontsize', 12); % Beschriftung der Achsen mit Schriftgröße 12
xp = 0.35;
yp = -0.35;
hold on;
plot(xp,yp,'o','MarkerSize',400,'MarkerEdgeColor','b'); %Kreis plotten Mittelpunkt xp;yp
grid on
xlim([0.30.4])% Bereich für x Achse ylim([-0.4-0.3])% Bereich für y Achse set(gca, 'xtick', min(xlim):0.025:max(xlim)); % Bestimmt die Einteilung der x Achse set(gca, 'ytick', min(ylim):0.025:max(ylim));
pause(0.8);
p = reduce_plot(r_Rx(1,1),r_Ry(1,1),'x', 'MarkerSize',10,'MarkerEdgeColor','r');
mov(1:numel(r_Rx)-1) = struct('cdata', [],...
'colormap', []);
for n = 1:numel(r_Rx-1) set(p,'Xdata', r_Rx(n), 'Ydata', r_Ry(n)) pause(0.05)
mov(n) = getframe(gcf);
end
hold off
%
movie2avi(mov,'out.avi', 'compression', 'None', 'fps',15);
movie2avi habe ich zunächst auskommentiert und es zeigte sich, dass getframe der Flaschenhals ist. Hier wird eine Fehlermeldung erzeugt, dass nicht genügend Speicher zur Verfügung steht. Ich bekomme auch von Windows die Hinweisfenster, dass :C nur noch weniger Speicherplatz hat. Leider ist der Rechner tatsächlich sehr voll. Dagegen kann ich nichts tun.
Lasse ich movie2avi mit durchlaufen, stürzt der Rechner ab.
Die Idee mit der Preallocation ist gut, aber ich habe keine Idee, wie und wo ich da ansetzen kann.
Kannst Du mir noch mal helfen?
Wenn Die C-Partition nahezu voll ist, hilft alles nichts. Wenn weniger als 1% frei sind, kann der Rechner grandios abschmieren und alle Daten entgültig mit in den Abgrund reißen. Deshalb hilft nur eines: Aufräumen und/oder neue Platzte kaufen.
Du schreibst zwar, dass Du dagegen nichts tun kannst. Das glaube ich Dir auch. Aber dann ist der rechner nicht mehr sinnvoll nutzbar und das Basteln am Matlab-Code bringt nichts.
Hast Du Admin-Rechte auf dem Computer? Dann Hibernation-File löschen:
Zitat:
powercfg -h off
Das bringt schon mal so viel Festplatten-Platz wie Du RAM hast. Danach geht der Rechner zwar nicht mehr in den Hibernate-Mode. Aber wenn die Platte ganz voll läuft geht der Rechner sowieso in den Do-not-Boot-anymore-Mode, der noch mehr Energie spart.
Dann den virtuellen Speicher auf eine andere Festplatte bewegen bis auf 200kB. (siehe Internet).
Nun Kontext-Menü für die C-Partition öffnen, Eigenschaften -> "Disk Cleanup" (ich glaube "Festplatte bereinigen" auf Deutsch). Dies erst einmal durchlaufen lassen. Dann nochmal starten und im Dialog auch auf "System-Dateien bereinigen" klicken. Hier kann man nun die Service-Pack-Backup Files und die Windows-Update-Cleanup löschen. Das sollte man nur tun, wenn man weiß, dass das System stabil läuft - aber eine volle System-Partition ist auf jeden Fall unsicherer.
Nun kann man WinDirStat verwenden um die größten Files zu finden, sie sich eventuell verschieben oder löschen lassen. Es lohnt sich nicht, sich um 1000 Files Gedanken zu machen, die nur ein paar kB benötigen.
So, und nachdem die Platte dann defragmentiert ist ist eine Geschwindigkeitsmessung von Matlab wieder sinnvoll.
:-)
Viel Erfolg, 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.