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 über Zeit berechnen Werte aus Vektor rausschmei

 

schlechter_iq

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2016, 18:24     Titel: Mittelwert über Zeit berechnen Werte aus Vektor rausschmei
  Antworten mit Zitat      
Hi,

ich bekomme zu jedem Zeitschritt einen neuen Wert für eine Variable.

Ich möchte, da ich sonst ein zu großes Rauschen hätte, für z.B. 5 Zeitschritte die Werte speichern und davon stets den Mittelwert ausgeben lassen.
Wenn der Vektor voll ist, soll der neue Wert am Ende eingespeichert werden und dafür der älteste rausgeworfen werden.

Wie bekomme ich sowas hin?

Das Ganze soll ungefähr so aussehen:

t=0: x=0
t=1: x=3
t=2: x=56
t=3: x=5
t=4: x=6
t=5: x=58
t=6: x=7
t=7: x=33
etc.

der dazugehörige Vektor sollte dann eben so aussehen:

t=0: V=[0 0 0 0 0] MW=0
t=1: V=[3 0 0 0 0] MW=3
t=1: V=[3 56 0 0 0] MW= 59/2
t=1: V=[3 56 5 0 0] MW=64/3
t=1: V=[3 56 5 6 0] MW=70/4
t=1: V=[3 56 5 6 58] MW=138/5
t=1: V=[56 5 6 58 7] MW=143/5
t=1: V=[5 6 58 7 33] MW= 109/5
etc.

Das Ganze sollte möglichst ohne Schleife geschehen.

Hier mein bisheriger Code:

Code:
[MW]=fcn(x)

%Hier muss jetzt eine if-Abfrage mit einer Wertezuweisung des Vektors V rein

Alles=sum(V);
Anz_Nullen= sum(V==0);
Anz_Werte = length(V)-Anz_Nullen;
MW=Alles/Anz_Werte ;


Kann mir jemand helfen? Ich verstehe das nicht mit dem neu umsortieren der Vektorwerten.

lg

sarah


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.04.2016, 20:11     Titel:
  Antworten mit Zitat      
Hallo,

du möchtest also einen gleitenden Mittelwert.

Im neuesten Release R2016a gibt es die Funktion movmean .

Für ältere Versionen gibt es hier im Forum jede Menge Beiträge zu diesem Thema.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ramesh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2016, 09:44     Titel:
  Antworten mit Zitat      
Hallo,

du darfst nicht vergessen, dass eine Funktion kein Gedächnis hat.
D.h. wenn du dieser einen Wert übergibst, hat sie diesen beim nächsten Funktionsaufruf nicht mehr.
So versteh ich jedenfalls deinen Code. Du übergibst einen Wert 'x', der in 'V' abgelegt werden soll. Beim nächsten Funktionsaufruf übergibst du ein weiteres 'x', webei das vorherige 'x' nicht mehr bekannt ist.

Zitat:
Wenn der Vektor voll ist, soll der neue Wert am Ende eingespeichert werden und dafür der älteste rausgeworfen werden.

Das geht zum Beispiel so:

Code:
V = zeros(1, 5); %Mit 0 initialisieren
V = [V(2:end) x];
%Neuer Wert immer am Ende einfügen und der erste wird rausgeworfen
 
protagonist
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 22.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2016, 11:16     Titel:
  Antworten mit Zitat      
wie wird denn bisher dein V erstellt wenn nicht mit Schleife? Verstehe ich es richtig, dass dein Problem das Zurückspringen der Einsatzposition des neuen Wertes ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
schlechter_iq

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2016, 11:35     Titel:
  Antworten mit Zitat      
Hi mein bisheriger Code sieht so aus:
Code:

function [mw, vektor_neu]= fcn(a, vektor_alt)

%Initialisierungen
%Anzahl zu berücksichtigender Werte
consid               = 100;
%Neuer Vektor/Verlauf der Werte                      
vektor_neu  = zeros(1, consid);
%Neuer gleitender Mittelwert
mw     = 0;


%Der erste bzw. älteste Wert des alten Vektors wird eliminiert
%Dafür wird der jüngst eingetroffene Wert an das Ende gesetzt
vektor_neu  = [vektor_alt(2:end) a];

%Berechnung der Summe aller Vektorelemente
summe               = sum(vektor_neu);

% Anzahl Nullen in Vektor:
anz_nullen           = sum(vektor_neu==0);

%Mittelwert aller Elemente ungleich Null
%Null bedeutet: Kein Wert
anz_werte          = consid-anz_nullen;

%Berechnung
mw     = summe/(anz_werte);


Anscheinend ist das noch nicht korrekt, kann mir jmd helfen?
Danke
 
schlechter_iq

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2016, 11:39     Titel:
  Antworten mit Zitat      
Ach ja was ich noch vergessen habe:

Das ganze mache ich ja als Matlab FCN Block in Matlab Simulink.
Daher wird der neue vektor über einen Sample Hold Block für einen Zeitschritt gespeichert bzw. dem FCN Block wieder zugeführt.

Was mir die Funktion jetzt ausgibt ist ein zu hoher Wert, daher kann der Code so noch nicht stimmen.

Grüße
 
protagonist
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 22.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2016, 11:59     Titel:
  Antworten mit Zitat      
Fehler konnte ich jetzt auch keine erkennen. dein Vektor_neu ist richtig?
Ich würde dir jetzt einfach mal diesen Vorschlag machen, wenn du diese ganzen Variablen garnicht brauchst:

Code:
function [mw, vektor_neu]= fcn(a, vektor_alt)


% Neuer Vektor/Verlauf der Werte                      
vektor_neu  = [vektor_alt(2:end) a];

% Mittelwert
mw = mean(vektor_neu(vektor_neu~=0));
 


Hast du dir schon mal die einzelnen Vektoren alle ausgegeben und damit versucht nachzuvollziehen, wo denn der Fehler steckt?
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.