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

Werte einer Messreihe auf Sekundenwerte mitteln

 

initramfs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2015, 18:23     Titel: Werte einer Messreihe auf Sekundenwerte mitteln
  Antworten mit Zitat      
Hallo,

ich habe eine Messreihe mit Zeitstempeln und zugeordneten Messwerten:

Code:

t=[0.03 0.252 0.57 0.748 1 1.124 1.56 1.70 2 2.22 2.57]
v=[11.20 11.24 11.55 11.78 12.18 12.87 13.89 13.54 13.84 14.21 14.50]

    t        v
    0.0300   11.2000
    0.2520   11.2400
    0.5700   11.5500
    0.7480   11.7800
    1.0000   12.1800
    1.1240   12.8700
    1.5600   13.8900
    1.7000   13.5400
    2.0000   13.8400
    2.2200   14.2100
    2.5700   14.5000
 


Ich möchte nun gemittelte Werte für jede Sekunde angeben. Dafür runde ich die Sekunden mit ceil auf.

Code:

t_sek=ceil(t)

    1.0000   11.2000
    1.0000   11.2400
    1.0000   11.5500
    1.0000   11.7800
    1.0000   12.1800
    2.0000   12.8700
    2.0000   13.8900
    2.0000   13.5400
    2.0000   13.8400
    3.0000   14.2100
    3.0000   14.5000
 


Nun möchte ich jedem vollen Sekundenwert den Mittelwert der zugehörigen Messwerte zuordnen. Das Problem ist, dass es unterschiedlich viele Messwerte pro Sekunde geben kann. Gibt es dafür eine effektive Lösung?

Ich hatte überlegt, mit

Code:
[unval,index, same]= unique(t_sek)

index =

     5
     9
    11
 


die Sprünge im Sekundenwert zu finden und dann in einer Schleife immer die Messwerte zwischen zwei Indexwerten zu mitteln.

Allerdings hoffe ich, dass es dafür auch eine bessere Lösung ohne Schleife gibt.

vielen Dank schon mal für jeden Vorschlag!


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.11.2015, 19:54     Titel:
  Antworten mit Zitat      
anstatt zu runden könntest du auch interpolieren. falls das auch zu einem ergebiss führt das für dich ok ist.
wenn du eine lösung mit einer schleife hast dann ist doch gut Smile zeit in eine verschnellerung des codes zu investieren lohnt sich nur wenn die zeit die man aufwändet geringer ist als die zeit die man dann spart. Wink
_________________

richtig Fragen
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: 11.11.2015, 21:52     Titel:
  Antworten mit Zitat      
Hallo,

wenn du unbedingt alle Werte, die innerhalb einer Sekunde vorliegen, mitteln und auf auf die aufgerundete Sekunde schreiben möchtest, dann kannst du sowas mit accumarray sehr effektiv lösen. Detailliert erklärte Beispiele von mir findest du hier oder hier.
Code:
% unique t-Werte und die Indizes, an denen sie auftreten
[t_unique,~,idx] = unique(t_sek);
% Intervalle mitteln und endzeit-stempeln
v_acc =  accumarray(idx', v',[], @mean);

Dir sollte aber klar sein, dass du mit diesem Verfahren deinem Signal eine Phasenverschiebung aufprägst, da du die Daten eines Intervalls (beispielsweise von 0 bis 1) auf die rechte Intervallgrenze schreibst.

Ansonsten schließe ich mich Winkow an und schlage interp1 vor.
Code:
% Linear Interpolieren
v_interp = interp1(t, v, t_unique);


Die Phase kann man auch direkt sehen: (dieser Code oder im Anhang)
Code:
% Ergebnis darstellung
figure
plot(t, v, 'k*-')
hold on
plot(t_sek, v, 'bo')
plot(t_unique, v_acc,'rx-')
plot(t_unique, v_interp, 'g+-')
legend('location', 'southeast', 'original data', 'stacked data', 'accumarray', 'interp1')


VG,
Nras.

untitled.png
 Beschreibung:

Download
 Dateiname:  untitled.png
 Dateigröße:  5.94 KB
 Heruntergeladen:  387 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
initramfs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2015, 12:35     Titel:
  Antworten mit Zitat      
Vielen Dank Winkow und Nras,

ihr habt natürlich Recht, eine Interpolation ist der richtige Ansatz, da dadurch die Messwerte keinen Offset bekommen (das sieht man wirklich gut an Nras' Plot). Also hab ich die Variante mit interp1 genutzt, als Spline-Interpolation.

accumarray habe ich aber auch noch getestet, das funktioniert natürlich auch gut, nur werden eben die Messwerte dadurch verfälscht.
 
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.