我想在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个元素进行平均。
感谢任何帮助!
答案 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