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

3

我希望在Matlab中对向量进行分段平均。向量x的格式如下:

x = 1:15;

分别是:

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

我想要计算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])
]

对于元素数量小于5的情况,程序应该对所有n个元素求平均值。例如,如果只有3个元素可用,代码应该计算前3个元素的平均值。对于大于5的情况,程序应该对最后5个元素求平均值。

非常感谢您的帮助!

4个回答

3

对于这样的滑动求和或平均操作,非常高效的矢量化方法是使用1D卷积conv,方法如下 -

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

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;

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

0

这里有一种替代方法,即创建一个矩阵,其中包含每行要求平均值的所有数字。在bsxfun()函数中,为当前数字的前4个数字逐行创建了一个新的四行向量,然后省略了所有非零元素并将其变为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接