Matlab中n个元素的分段平均值

时间:2016-06-10 19:48:09

标签: matlab

我想在Matlab中对一个向量进行分段平均。 Vector x看起来像这样:

x = 1:15;

分别为:

x = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]

我想找到n = 5个元素的平均值;因此,结果向量y应如下所示:

y = [1 1.5 2.5 3 4 5 6 7 8 9 10 11 12 13]

生成向量y的代码应该以某种方式工作:

y = [
mean ([1])
mean ([1,2])
mean ([1,2,3])
mean ([1,2,3,4])
mean ([1,2,3,4,5])
mean ([2,3,4,5,6])
mean ([3,4,5,6,7])
mean ([4,5,6,7,8])
mean ([5,6,7,8,9])
mean ([6,7,8,9,10])
mean ([7,8,9,10,11])
mean ([8,9,10,11,12])
mean ([9,10,11,12,13])
mean ([10,11,12,13,14])
mean ([11,12,13,14,15])
]

对于n < 5元素,该程序应平均超过n个元素。例如,如果只有3个元素可用,则代码应平均前3个元素。对于n > 5元素,程序应该对最后5个元素进行平均。

感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

对于这种滑动求和或平均操作,一种非常有效的矢量化方法将是1D卷积conv,就像这样 -

n = 5
sums = conv(x,ones(1,n))
out = sums(1:numel(x))./[1:n n*ones(1,numel(x)-n)]

答案 1 :(得分:0)

下面是一种蛮力方法。

for j=1:length(x)
    A=j-4;
    if A<1 
        A=1;
    end;
    y(j)=mean(x(A:j))

end;

或以更紧凑的形式:

for j=1:length(x)
    y(j)=mean(x(max(j-4,1):j));
end;

答案 2 :(得分:0)

试试这个:

x = 1:15;
for n = 1:length(x)
    if n <= 5
        y(n) = mean(x(1:n))
    else
        y(n) = mean(x(n-4:n))
    end
end

答案 3 :(得分:0)

这是另一种方法 制作一个矩阵,其中包含你必须在每一行中取平均值的所有数字的矩阵,在bsxfun()函数中,一个向量的四个新行为1:15的每个元素逐行创建。省略当前数字,然后忽略所有非零元素,并使用amde 0

n =

     5

A  = bsxfun(@plus ,[1:15].',-(n -1):0)
A(A<0) = 0
A =

     0     0     0     0     1
     0     0     0     1     2
     0     0     1     2     3
     0     1     2     3     4
     1     2     3     4     5
     2     3     4     5     6
     3     4     5     6     7
     4     5     6     7     8
     5     6     7     8     9
     6     7     8     9    10
     7     8     9    10    11
     8     9    10    11    12
     9    10    11    12    13
    10    11    12    13    14
    11    12    13    14    15

然后将每行的总和除以每行中非零元素的数量

>> sum(A,2)./sum(~ismember(A,0),2)

ans =

    1.0000
    1.5000
    2.0000
    2.5000
    3.0000
    4.0000
    5.0000
    6.0000
    7.0000
    8.0000
    9.0000
   10.0000
   11.0000
   12.0000
   13.0000