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

Gleitender Mittelwert

 

Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2008, 14:54     Titel: Gleitender Mittelwert
  Antworten mit Zitat      
Hallo zusammen,

ich möchte aus eine Reihe von Messdaten die Mittelwerte berechnen, da ich nicht der Matlab-Experte bin, hoffe ich auf ein wenig Hilfe.
Also folgendes, ich habe n-Datenpunkte und möchte zunächst den Mittelwert von
(n1+n2)/2, danach
(n1+n2+n3)/3....bis
(n1+...+nn)/n

Hat jemand eine Idee, wie das gehen soll? ich wäre sehr dankbar für jeden Vorschlag.

Grüsse,
Maria


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 30.05.2008, 16:23     Titel:
  Antworten mit Zitat      
Hallo Maria,

mein Vorschlag:

Code:
n = length(Datenvektor);

for index = 2:n
    Mittelwert(index-1) = mean(Datenvektor(1:index));
end


Mittelwert ist dann ein Vektor der Länge n-1.

Herzliche Grüße
Bijick

P.S. Bin ja gespannt, ob es jemand ohne Schleife schafft...
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2008, 17:57     Titel:
  Antworten mit Zitat      
Hi Bijick,

vielen Dank fuer die schnelle Antwort, es ist fast genau das was ich wollte. ich moechte es nur noch dynamisch gestalten, da ich i-Files zum auswerten habe.

Also
Code:

N{i}= length(Daten{i});

for index = 2:N{i}
    Mittelwert{i}(index-1) = mean(Daten{i}(1:index));
end;
 


in der for-Schleife funktioniert aber nicht mit index{i}=2:N{i}, hast du vielleicht noch eine Idee wie das funktioniert.

Schoene Gruesse,
Maria
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 02.06.2008, 09:22     Titel:
  Antworten mit Zitat      
Hallo Maria,

warum willst du denn N auch indizieren? Und warum als Cell?
Probiers mal ohne N{i} sondern nur mit N...
Falls es nicht klappt, dann müsstest du mal die Fehlermeldung posten, meist kann man daran den Fehler erkennen Wink

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2008, 10:42     Titel:
  Antworten mit Zitat      
Hallo Alex,

das N moechte ich auch indizieren, da ich hunderte von Dateien auswerten muss, die verschiedene Laenge haben und fuer jede Laenge veraendert sich auch der index.

Wenn ich nur N eingebe kommt folgende Fehlermeldung raus:

??? Cell contents reference from a non-cell array object.

Wenn du eine Loesung dafuer hast, waere ich sehr dankbar! Smile

Gruss
Maria
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 02.06.2008, 11:20     Titel:
  Antworten mit Zitat      
Ich vemute mal, dass du die Datensätze nacheinander innerhalb einer for-Schleife abarbeitest!?
Brauchst du denn das N später nochmal? Wenn nicht, macht es keinen Sinn, es zu indizieren, da es ja ruhig in jedem Schleifendurchlauf überschrieben werden kann.

Mir schwebt bei deinem Problem folgende Sturktur vor:
Code:

for k=1:numel(Daten) % Beginn der for-Schleife die soviele Durchläufe hat, wie Datensätze vorhanden sind

    n = length(Datenvektor);

    for index = 2:n
        Mittelwert{k}(index-1) = mean(Daten{k}(1:index));
    end

end % Ende der Datensatz-Schleife
 

Ich habs nicht probiert, aber prinzipiell sollte das funktionieren.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2008, 13:17     Titel:
  Antworten mit Zitat      
Hallöchen,

am besten schicke ich mein ganzes Programmcode:

Code:

clear all;
clc;
pathname=uigetdir;
files = dir(fullfile(pathname,filesep,'*stat*.rw'));
names = {files.name};
for i=1:length(files) ;
messwerte{i}= dlmread ([pathname, filesep,files(i).name],';' ,6,0);

datenstrom{i} =messwerte{i}(:,1);

Daten{i}= datenstrom{i}(-408<=datenstrom{i}& datenstrom{i}<=408);

%Gleitender Mittelwert
for k=1:numel(Daten) % Beginn der for-Schleife die soviele Durchläufe hat, wie Datensätze vorhanden sind

    n = length(Daten);

    for index = 2:n
        Mittelwert{k}(index-1) = mean(Daten{k}(1:index));
    end

end % Ende der Datensatz-Schleife
end


Es funktioniert nicht, da ich meine Datenvektoren in einem cell habe - Daten {i} und das n ist immer unterschiedlich.

Gruss,
Maria
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 02.06.2008, 17:08     Titel:
  Antworten mit Zitat      
Hallo,

es liegt an der Zeile:
Gast hat Folgendes geschrieben:

Code:

    n = length(Daten);
 


Da hab ich bei mir vorhin nicht dran gedacht...
Es muss natürlich so heißen:
Code:
n = length(Daten{i});
Embarassed

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 05.08.2010, 12:09     Titel:
  Antworten mit Zitat      
Hi:)
es ist zwar 2 Jahre später aber ich bin auf diesen Thread jetzt erst gestoßen und wollte mein Senf dazu geben. Hier ist ein Algorithmus wie man sowas ohne Schleife machen kann:

Code:

x = (1:10)';
WindowSize = length(x);
Con = conv(x,ones(WindowSize,1));
Con = Con(1:end-WindowSize+1);
Average = Con./cumsum(ones(WindowSize,1));
 

Obwohl das was gewollt ist, ist gar kein gleitender Mittel. Gleitender Mittel wüdre so ähnlich aussehen:

(n1+n2)/2
(n2+n3/2
(n3+n4)/2 ...etc....
und hier ist der matlab code für sowas:

Code:

x= rand(100,1)
WindowSize = 5;
moving_average = conv(x,ones(Windowsize,1)/WindowSize);
 


oder:
Code:

moving_average=filter(ones(1,windowSize)/windowSize,1,x);
 


Lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
Ilsa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 13:07     Titel:
  Antworten mit Zitat      
Okay, und was wäre eine kluger code für folgendes Problem?

(n1+n2)/2
(n3+n4/2
(n5+n6)/2 ...etc....


Beispiel:

gegeben=1:10,

gesucht=schlauer code mit windowsize von beispielsweise 2...

ans=1.5 3.5 5.5 7.5 9.5

Hoffe hier sieht noch mal jemand rein.
Vielen Dank und viele Grüße
Ilsa
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 23.08.2010, 13:31     Titel:
  Antworten mit Zitat      
Hi,

so:
Code:

idx1 = 1;
idx2 = 0;
for k = 1:10
      idx2 = idx2+2;
      result(k) = ((idx1)+(idx2))/2  
      idx1 = idx1+2;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Ilsa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 14:16     Titel:
  Antworten mit Zitat      
Hallo Vito,

dankeschön soweit.
Ich kann deinen Code nicht auf beliebige Vektoren, wie z.B.

A=[2 12 22 26 0 100]

anwenden. Oder doch?

Weiterhin bin ich auf der Suche nach etwas, was daraus je nach Fenstergröße

B= 6 24 50 (bei windowsize 2)

oder

B=12 42 (bei window size 3)

macht.
Sorry wegen dieser unqualifizierten Fragerei, aber ich kenne dieses Matlab leider noch gar nicht.
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 23.08.2010, 14:26     Titel:
  Antworten mit Zitat      
Hi,

damit ich dich recht verstehe. Du willst ein Code, welches dir unabhängig vom Vektor immer als Ergebnis:
Code:

1.5 3.5 5.5 7.5 ...
 

Liefert. Wenn das so sein sollte, dann kannst du das doch einfach hart eintragen und keine Berechnung vornehmen. Z. B. so:
Code:

A=[2 12 22 26 0 100]
idx1 = 1;
idx2 = 0;
for k = 1:length(A)
      idx2 = idx2+2;
      result(k) = ((idx1)+(idx2))/2  
      idx1 = idx1+2;
end
 

Und das mit Windowsize habe ich nicht verstanden Sad

Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
Ilsa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 14:51     Titel:
  Antworten mit Zitat      
Nein, so meinte ich das natürlich nicht.
Gar nicht so einfach sich klar auszudrücken. Wahrscheinlich ist es deswegen auch nicht so einfach mit dem programmieren.

Eine Reihe aus reellen Zahlen soll gemittelt werden. Allerdings soll das nicht kumulativ (für die ganze Reihe) und auch nicht gleitend passieren.
Sondern eben so

(n1+n2)/2
(n3+n4/2
(n5+n6)/2

oder so:

(n1+n2+n3)/3
(n4+n5+n6)/3

Das "Fenster" über das gemittelt werden soll wird also um die komplette Länge verschoben und soll nicht überlappend verschoben werden wie beim Gleitenden Mittel.


A = 1:10; war ein Beispiel
und 1.5 3.5 5.5 7.5 9.5 war nur für dieses Beispiel das gewünschte Resultat (bei einer Fenstergröße von 2).
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 23.08.2010, 17:26     Titel:
  Antworten mit Zitat      
Hi,

meinst du sowas ein kleines Bsp:
Code:

clear
clc
a =[2 12 22 26 0 100];
a1 = [13 24 3 100 3 33 98 31 56 71];
A = {a,a1};
[n m] = size(A);
for krun = 1:m
idx1 = 1;
idx2 = 0;
laenge = length(A{krun})/2;    
for k = 1:laenge
      idx2 = idx2+2;
      Result{krun}(k) = (A{krun}(idx1)+A{krun}(idx2))/2;  
      idx1 = idx1+2;
end
end
 

Hinweis dein Vektor a muss immer gerade sein. Dieser Code erfüllt genau
(n1+n2)/2
(n3+n4/2
(n5+n6)/2
.
Und mit Result{1} oder Result{2} kannst du dir die Ergebnisse ausgeben lassen.

Gruß,
Vito
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 - 2024 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.