2012-03-18 3 views
1

У меня есть вектор x, содержащий информацию о скорости, а индекс представляет время. Теперь я хочу, чтобы создать новый вектор, сохраняя его размер, но значения заменяются средним значением интервала времени, например:Matlab: среднее значение с интервалом времени?

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

, если я хочу, чтобы интервал времени будет 4, вывод должен выглядеть следующим образом:

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 

Есть ли функция, которая делает это? thanks

+0

Это читается так, как будто вы хотите скользящую среднюю. Это верно? – PengOne

+0

Я думаю, что я не совсем понял, чего вы пытаетесь достичь, но вы можете взглянуть на [smooth] (http://www.mathworks.com/help/toolbox/curvefit/smooth.html) , –

+0

Да, скользящее среднее - это то, что я искал! есть ли встроенная функция, которая делает это? также я попробовал сгладить, он не сглаживает его очень сильно, я предполагаю, что это потому, что мой график слишком «шумный», только поиск среднего может уменьшить шум. – Bonk

ответ

1

Вот метод, который не требует, чтобы ваше время вектор кратен длиной интервала, который сочетает в себе accumarray с некоторой умной индексацией.

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

Похоже, что вы пытаетесь выполнить степпинг по всему набору входных данных, сохраняя при этом длину начального входного вектора. Насколько мне известно, для этого не существует единой функции.

Однако вы можете сделать это на Python довольно легко. Например:

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 
Смежные вопросы