Matlab: значит со временем? - PullRequest
       13

Matlab: значит со временем?

1 голос
/ 19 марта 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Вот метод, который не требует, чтобы ваш временной вектор был кратным длине интервала, который объединяет 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 голосов
/ 19 марта 2012

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

Тем не менее, вы можете сделать это в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...