2012-03-18 5 views
1

J'ai un vecteur x contenant des informations de vitesse et l'index représente le temps. Maintenant, je veux créer un nouveau vecteur, en conservant sa taille, mais les valeurs sont remplacées par moyen d'un intervalle de temps, par exemple:Matlab: Moyenne avec intervalle de temps?

x = 
    101 
    102 
    103 
    104 
    105 
    106 
    107 
    108 
    109 
    110 
    111 
    112 

si je veux intervalle de temps pour être 4, la sortie devrait ressembler à:

o = 
102.5 
102.5 
102.5 
102.5 
106.5 
106.5 
106.5 
106.5 
110.5 
110.5 
110.5 
110.5 

Y at-il une fonction qui fait cela? merci

+0

Cela signifie que vous voulez une moyenne mobile. Est-ce exact? – PengOne

+0

Je pense que je n'ai pas bien compris ce que vous essayez d'atteindre, mais vous voudrez peut-être jeter un oeil à [smooth] (http://www.mathworks.com/help/toolbox/curvefit/smooth.html) . –

+0

Oui, la moyenne mobile est ce que je cherchais! Y at-il une fonction intégrée qui fait cela? j'ai aussi essayé en douceur, ça ne le lisse pas beaucoup, je devine que c'est parce que mon graphe est trop "bruyant", seul trouver la moyenne permet de réduire le bruit. – Bonk

Répondre

1

est ici une méthode qui ne nécessite pas que votre vecteur de temps est un multiple exact de la longueur de l'intervalle qui combine accumarray avec une indexation intelligente.

x = [101 
    102 
    103 
    104 
    105 
    106 
    107 
    108 
    109 
    110 
    111 
    112]; 

intervalLength = 4; 

%# create index array 
%# for array of length 10, 
%# intervalLength 4, this gives 
%# [1 1 1 1 2 2 2 2 3 3]' 
idx = zeros(length(x),1); 
idx(1:intervalLength:end) = 1; 
idx = cumsum(idx); 

%# average time 
avg = accumarray(idx,x,[],@mean); 

%# create output array - use index to replicate values 
out = avg(idx); 

out = 
    102.5 
    102.5 
    102.5 
    102.5 
    106.5 
    106.5 
    106.5 
    106.5 
    110.5 
    110.5 
    110.5 
    110.5 
0

Il semble que vous essayez d'effectuer une moyenne pas à pas dans l'ensemble de données d'entrée, tout en préservant la longueur du vecteur d'entrée initial. À ma connaissance, il n'y a pas de fonction unique pour le faire. Cependant, vous pouvez le faire assez facilement en Python. Par exemple:

def blurryAverage(inputCollection, step=1): 
    """ Perform a tiling average of an input data set according to its 
    step length, preserving the length of the initial input vector """ 

    # Preconditions 
    if (len(inputCollection) % step != 0): 
     raise ValueError('Input data must be of divisible length') 

    ret = [] 
    for i in range(len(inputCollection)/step): 
     tot = 0.0 
     for j in range(step): 
      tot += inputCollection[(i*step)+j] 

     for j in range(step): 
      ret.append(tot/step) # Implicit float coercion of step 

    return ret 


>>> blurryAverage([1,2,3,4,5,6],3) 
[2.0, 2.0, 2.0, 5.0, 5.0, 5.0] 

>>> blurryAverage([1,2,3],4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in blurryAverage 
ValueError: Input data must be of divisible length 
Questions connexes