Matlab:平均时间间隔?

时间:2012-03-18 21:52:51

标签: matlab mean

我有一个包含速度信息的向量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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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