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

Mittelwertbilung nach Zeitintervall, Messwerte unregelmäßi

 

Mantequilla
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 10.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2018, 16:40     Titel: Mittelwertbilung nach Zeitintervall, Messwerte unregelmäßi
  Antworten mit Zitat      
Guten Tag,

ich komme bei einer Messdatenauswertung nicht weiter. Ich muss aus meinen Messwerten Mittelwerte in 10 Sekunden-Intervallen bilden.
Aber ich erhalte nicht zu jeder Sekunde einen Messwert, weil mein Sensor für einen Takt etwas länger als eine Sekunde benötigt. So habe ich zum Beispiel für 7 Sekunden keinen Wert erfasst.
Außerdem habe ich erhalte ich zu einigen Zeitpunkten (z.B.: 8, 10, 18 ) keinen numerischen Wert. Dieser soll einfach ignoriert werden.


Hier ein Beispielsatz:
Code:

ans =

     1     6
     2     4
     3     4
     4     5
     5     6
     7     4
     8   NaN
     9     5
    10   NaN
    11     9
    13     2
    14    85
    15     4
    16     5
    17    12
    18   NaN
    19     4
    20   NaN
    21     8
    22     5
    23   NaN
    25     1
    26     5
    27    68
    29    45
    30   NaN
    31     8
    32     5
    33    45
    34    68
    35     4
 


Es soll also quasi folgendes gerechnet werden:
(Summe aller numerischen Werte zwischen 0 und 9 Sekunden) / Anzahl der numerischen Werte
<br />
und im nächsten Schritt:
(Summe aller numerischen Werte zwischen 10 und 19 Sekunden) / Anzahl der numerischen Werte
<br />
Das Ergebnis sollte dann als Spaltenvektor ausgegeben werden.
Gibt es für so eine Anwendung eine Funktion / Schleife oder ähnliches?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2018, 01:39     Titel:
  Antworten mit Zitat      
Hallo,

am besten eine Matrix anlegen, in der jede Spalte einen zu mittelnden Zeitraum enthält ( reshape ). Dann mean mit Option 'omitnan' verwenden.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 10.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2018, 12:40     Titel:
  Antworten mit Zitat      
Für die Mittelwertbildung ist mean mit Option omitnan super.
Nur reshape hilft mir nicht weiter. Die neue Matrix hätte ja dann eine feste Spaltengröße. Die Mittelung nach Zeitinvervall wäre nicht mehr gegeben, da ich pro Mittelungszeitraum unterschiedlich viele Messwerte (zwischen 6 und 10) erhalte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avo
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.12.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 17.01.2018, 13:35     Titel:
  Antworten mit Zitat      
Keine ahnung wie der Post hier zustande gekommen ist, bitte löschen.

Zuletzt bearbeitet von Avo am 17.01.2018, 13:37, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Avo
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.12.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 17.01.2018, 13:36     Titel:
  Antworten mit Zitat      
Hallo.

Mantequilla hat Folgendes geschrieben:
Die Mittelung nach Zeitinvervall wäre nicht mehr gegeben, da ich pro Mittelungszeitraum unterschiedlich viele Messwerte (zwischen 6 und 10) erhalte.


Was hat die Mittelung nach Zeitintervall mit der Anzahl der Messwerte zu tun?
Vielleicht versteh ich da ja etwas falsch, aber wenn ich alle in einem Zeitintervall vorliegenden Messwerte mittle, erhalte ich immer einen vollwertigen Mittelwert für diesen Zeitintervall, unabhängig davon wie viele Messwerte tatsächlich vorliegen.
Das einzige was man da viellleicht sagen noch könnte, ist dass die Genauigkeit bei mehr Messpunkten in der Regel höher einzuschätzen ist, aber das ist dann nicht durch die Programmierung der Auswertung, sondern durch die Aufnahme der Messwerte begrenzt.



Vll. löst das hier dein Problem, geht aber sicher noch eleganter.
Code:
data(:,1) = [1 2 3 4 5 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 25 26 27 29 30 31 32 33 34 35]';
data(:,2) = [6 4 4 5 6 4 NaN 5 NaN 9 2 85 4 5 12 NaN 4 NaN 8 5 NaN 1 5 68 45 NaN 8 5 45 68 4]';
Values=[];mValues=[];k=0;
for i = 1:length(data)
      if data(i,1) < (10+10*k)
            Values = [Values data(i,2)];
      else
            mValues=[mValues;mean(Values, 'omitnan')];
            k = k+1;
            Values = data(i,2);
      end
end


Besten Gruß,
Avo
Private Nachricht senden Benutzer-Profile anzeigen
 
Mantequilla
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 10.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2018, 14:39     Titel:
  Antworten mit Zitat      
Das Problem ist, dass mit reshape keine Aufteilung nach Zeitintervallen möglich ist. Mit reshape kann ich eine Matrix umformen. und im nächsten Schritt aus den jeweiligen Spalten dann Mittelwerte bilden.
Aber eine Spalte umfasst in dem Fall eine Anzahl von Messwerten und nicht ein bestimmtes Zeitintervall. Der Charakter einer Matrix lässt nicht zu, Spalten unterschiedlich lang sind.
Beispiel:
Code:

TEST1 =

     1     6
     2     4
     3     4
     4     5
     5     6
     7     4
     8   NaN
     9     5
    10   NaN
    11     9
    13     2
    14    85
    15     4
    16     5
    17    12
    18   NaN
    19     4
    20   NaN
    21     8
    22     5
    23   NaN
    25     1
    26     5
    27    68
    29    45
    30   NaN
    31     8
    32     5
    33    45
    34    68
    35     4
    36     5
    37     8
    38     5
    39    45
    40     4

>> B = reshape(TEST1,[9,8])

B =

     1    11    21    32     6     9     8     5
     2    13    22    33     4     2     5    45
     3    14    23    34     4    85   NaN    68
     4    15    25    35     5     4     1     4
     5    16    26    36     6     5     5     5
     7    17    27    37     4    12    68     8
     8    18    29    38   NaN   NaN    45     5
     9    19    30    39     5     4   NaN    45
    10    20    31    40   NaN   NaN     8     4

Die ersten vier Spalten sind meine Zeitwerte und die letzten Vier die Messwerte. Die ersten beiden Zeitintervalle funktioniert es. Im dritten Zeitintervall erhalte ich nur 8 Messwerte. So rutscht der erste Messwert des vierten Zeitintervalls in die Mittelwertbildung des dritten Zeitintervalls.


Oder habe ich mit reshape die Möglichkeit, zu sagen, dass Werte aus einem bestimmten Zeitraum abgefragt werden, und die restlichen Werte der Spalte nit NaN Werten gefüllt werden? Und die Werte für den nächsten Zeitintervall in der nächsten Spalte übertragen werden?



Viele Grüße
Michael
Private Nachricht senden Benutzer-Profile anzeigen
 
Avo
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.12.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 17.01.2018, 15:07     Titel:
  Antworten mit Zitat      
Hallo,

da reshape den eigentlichen Inhalt nicht abfragt, denke ich nicht, dass man dein Problem ausschließlich mit dieser Funktion lösen kann.

Wenn du aber die Zeitlichen Lücken in deinen Daten mit NaN füllst, änderst du nichts an den Messwerten, kannst danach aber mit reshape weiterarbeiten:

Code:
% a = anfangszeitpunkt, b = endzeitpunkt, data = deine daten
newdata(:,1) = a:b;
for i = 1:b
      [minD, posD] = min(abs(data(:,1)-data(i)));
      if minD == 0
            newdata(i,2) = data(posD,2);
      else
            newdata(i,2) = NaN;
      end
end
 % ab hier dann reshape und so weiter


Was sagst du zu meinem vorherigen Lösungsvorschlag?

Besten Gruß,
Avo
Private Nachricht senden Benutzer-Profile anzeigen
 
Mantequilla
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 10.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2018, 18:35     Titel:
  Antworten mit Zitat      
Das Script hat an meiner Matrix nichts geändert.
Auf mein Beispiel bezogen habe ich a=1, b=40 und data=TEST1 (die Matrix) eingesetzt.

Gruß
Michael
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

eine Alternative könnten Timetables und die retime-Funktion dafür sein.

Ansonsten müsstest du für jedes Intervall bestimmen, welche Werte darin liegen, und diese eben mitteln.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 10.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2018, 09:31     Titel:
  Antworten mit Zitat      
Danke für die Hilfe, habs dann auch so in etwa gelöst. Ich suche in der ersten Spalte alle Zeilen, die sich in einem Zeitbereich befinden. Aus diesen Zeilen bilde ich denn aus der zweiten Spalte den Mittelwert. Dann schreibe ich ihn in eine nue Matrix (mit Zeit) und bereichne den nächsten Zeitbereich:
Code:
Zielmatrix = [];
for t1=0:10:30
    t2=t1+9;
Zeitbereich = find(t1<=TEST(:,1) & TEST(:,1)<= t2);
Mittelwert = mean(TEST(min(Zeitbereich):max(Zeitbereich),2),'omitnan');
t1=t1+10;
Zielmatrix=[Zielmatrix;t1 Mittelwert];
end
Zielmatrix


Danke für die Hilfe!

Gruß
Micahel
Private Nachricht senden Benutzer-Profile anzeigen
 
Avo
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 04.12.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 19.01.2018, 09:37     Titel:
  Antworten mit Zitat      
Hallo,

hatte einen Fehler in meiner Rechnung:

Code:
% a = anfangszeitpunkt, b = endzeitpunkt, data = deine daten
newdata(:,1) = a:b;
for i = 1:b
      [minD, posD] = min(abs(data(:,1)-newdata(i)));  % Marker
      if minD == 0
            newdata(i,2) = data(posD,2);
      else
            newdata(i,2) = NaN;
      end
end
 % ab hier dann reshape und so weiter


In der mit Marker markierten Zeile wird die Reihe in deinen Daten gesucht, welche den gleichen Zeitpunkt wie newdata hat; minD ist 0 wenn es einen gibt, etwas anderes, wenn es keinen gibt; vorher hab ich ausversehen data-data gerechnet, sodass natürlich immer einer gefunden wird und sich nichts ändert.

Als Ausgangspunkt für die data, habe ich deine 'Rohdaten' gewählt, also die irgendwas mal 2 Matrix.
Nochmal zu Erklärung, was diese Schleife machen soll, ist dafür zu sorgen, dass keine 'Lücken' mehr in deinem Zeitverlauf sind, damit das vorherige Problem mit reshape nicht mehr besteht. So liegt dann quasi für jede Sekunde ein Messwert vor.

Allerdings, könnte man auch reshape komplett umgehen, wie ich in meinem ersten Post versucht habe... vielleicht schaust du dir den Code da nochmal an. Wenn du Fragen dazu hast, frag.

Besten Gruß,
Avo
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 - 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.