1

我有一个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

有没有这样做的功能?谢谢

4

2 回答 2

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
于 2012-03-18T22:41:05.183 回答
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
于 2012-03-18T22:19:04.613 回答