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

Mittelwert mit for-Schleife

 

Dexter
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2014, 09:46     Titel: Mittelwert mit for-Schleife
  Antworten mit Zitat      
Hallo,

wieder mal stehe ich vor einem Problem. Und zwar habe ich Minutenwerte über einen sehr großen Zeitraum (über eine Million Zeilen) und Stundenwerte. Diese Werte würde ich nun gerne vergleichen. Soweit zur Ausgangslage, nun zum Problem.

Meine Idee ist, immer 60 Minutenwerte zu Mitteln. Das natürlich über alle Zeilen. Dazu verwende ich eine For-Schleife foglender Form:

Code:

k=1000 %aufgrund der schnelleren Berechnung erstmal kleinere Bereiche
mittel = zeros(k,1);

for n = 1:60:k
     for m= 61:60:k
           mittel(n) = mean(RVR_A(n:m));
     end
end
 


Das funktioniert solange ich k auf 1000 lasse. Verändere ich es zum Beispiel auf 2000, stimmen die Mittelwerte nicht mehr.
Desweiteren habe ich zwischen jedem berechneten Mittelwert immer 59 Nullzeilen. Diese habe ich versucht über einen Counter zu verhindern, das klappte aber nur bedingt.

Code:

k=1000
mittel = zeros(k,1);
c=1;

for n = 1:60:k
     for m = 61:60:k
           mittel(c,1) = mean(RVR_A(n:m));
           c=c+1;
     end
end
 


Hier erhalte ich NaNs die es eigentlich nicht geben darf und auchn viel zu viele Mittelwerte. Bei k = 1000 sollten es 16 Werte sein, jedoch erhalte ich 272.

Was mache ich falsch? Smile

Viele Grüße,
Dexter
Private Nachricht senden Benutzer-Profile anzeigen


Dexter
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2014, 10:15     Titel:
  Antworten mit Zitat      
Niemand eine Idee? Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
SkyRazor
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2014, 11:11     Titel:
  Antworten mit Zitat      
Hallo,

Test ist nicht möglich wegen der nicht verfügbaren variable RVR_A. In diesem Fall will niemand deine Code analysieren.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Dexter
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2014, 15:03     Titel:
  Antworten mit Zitat      
RVR_A ist einfach ein double mit 1377868 Zeilen in einer Spalte. Was für Werte das genau sind, spielt ja erstmal keine Rolle, meinetwegen von 1 bis 1377868.
Private Nachricht senden Benutzer-Profile anzeigen
 
SkyRazor
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2014, 16:14     Titel:
  Antworten mit Zitat      
Hallo,

bin nicht sicher,ob ich richtig verstanden habe.

Code:
RVR_A=1:10000;
k=1000;
mittel = zeros(fix(k/60),1);

for i=1:fix(k/60)
    mittel(i)= mean(RVR_A(60*i-59:60*i));
end


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.07.2014, 09:16     Titel:
  Antworten mit Zitat      
Hallo,

auch wenn in dem Titel "... mit for-Schleife" vorkommt, hier ein Vorschlag ohne for-Schleife:
Code:
N = 1377868;
PVR_A=(1:N)';
N = fix(N/60)*60;
mittel=mean(reshape(PVR_A(1:N),60,N/60))


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Dexter
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2014, 09:09     Titel:
  Antworten mit Zitat      
Danke euch beiden! Ihr habt mein Problem richtig verstanden und beide Versionen funktionieren einwandfrei.

Ich versuche mal den Code zu verstehen...
Bei SkyRazor:

Es wird zuerst eine Matrix erstellt und mit Nullen gefüllt. Dabei teilst du durch 60, wodurch mein Problem mit Nullen zwischen den eigentlichen Ergebnissen gelöst ist. Das fix rundet bei der Teilung auf ganze natürliche Zahlen.
Die Schleife läuft dann von 1 bis 1000/60 = 16,67 = 17. In der Schleife mittelst du immer 60 Werte, indem du i ganz normal von 1 bis 17 durchlaufen lässt.
Alles korrekt so?

Nras: Bei deinem Code bin ich mir nicht mehr ganz so sicher. Ich nehme an, die Zeile
Code:
N=fix(N/60)*60;
benutzt du, um N auf einen durch 60 teilbaren Wert zu bringen?
Anschließend erstellst du eine Matrix mit RVR_A(1:N)x60 und mittelst über jede Spalte einmal.
Korrekt?

Viele Grüße,
Dexter
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 08.07.2014, 09:54     Titel:
  Antworten mit Zitat      
Hallo Dexter,

das mit dem fix() stimmt. Das habe ich aber aus der anderen Lösung übernommen. Wenn ich genauer drüber nachdenke, hätte ich eher floor() benutzt, aber bei positiven Zahlen ist das ja das gleiche.
Dexter hat Folgendes geschrieben:
Anschließend erstellst du eine Matrix mit RVR_A(1:N)x60 und mittelst über jede Spalte einmal.

fast richtig. Es ist eine 60xN Matrix und nicht eine RVR_A(1:N)x60 Matrix - was auch immer das wäre Smile. Es hat also N Spalten und von jeder Spalte wird der Mittelwert gebildet. Daher ist das Ergebnis dann ein Zeilenvektor mit N Spalten.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
SkyRazor
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 07.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2014, 10:11     Titel:
  Antworten mit Zitat      
hallo,

Dexter hat Folgendes geschrieben:

Die Schleife läuft dann von 1 bis 1000/60 = 16,67 = 17.


laut der Dokumentation B=fix(A) rounds the elementsof A toward zero, d. h. fix(1000/60)=16, fix(-1000/60)=-16, aber floor(-1000/60)=-17. deshalb läuft die Schleife bis nur 16.

Eigentlich funktionieren beide Programme fast gleich, aber Nras´s ist besser und effizient.

Meine letzte Frage ist, was möchtest du mit die letzte einige Zahlen tun , z.b. k=1000, dann noch 40 Zahlen ab 961. Soll man auch die durchschnittliche Wert kriegen oder ist es egal? Da wir noch nicht sicher sind, haben beide Programme nichts getan.
Wenn notwendig, dann

Code:
letzt= mean(RVR_A(60*fix(k/60)+1:k));


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Dexter
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 22.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2014, 11:24     Titel:
  Antworten mit Zitat      
Ja die letzten Zaheln sind nicht so wichtig. Am Ende sollen zwei Werte quantitativ verglichen werden, weshalb 40 Zahlen +- bei 1,3 Millionen Werten keinen Unterschied im Diagramm machen.

Aber danke für den Hinweis! Very Happy

Viele Grüße,
Dexter
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.