我有一个已知的信号x
,我想在每10秒后分析一下:
t = 1:1:100; %time
x = 8*sin(t); %the signal
a1= 5; %known coefficient for the first 10s
对于这个信号,我对前10个进行了第一次分析:
%analysis 1
x1 = x(1:11);
y1 = x1*a1;
y_mean1 = mean(y1);
a2=y_mean1; %coefficient necessary for the next 10s
现在我执行接下来10年的分析:
%analysis 2
x2 = x(12:22);
y2 = x2*a2;
y_mean2 = mean(y2);
a3 = y_mean2; %coefficient necessary for the next 10s
这将重复信号的总长度。但是,这种方法并不是我想象的最方便。我该如何进行循环?
谢谢!
答案 0 :(得分:2)
很容易循环:
n=10;
a = 5;
y_mean = [];
for ind = 1:n:100
y = x(ind:ind+n)*a;
a = mean(y);
y_mean(end+1) = a;
end
但你可以找到一种没有循环的方法mean(reshape(x, 10, []))
是一个好的开始,并检查cumsum
样式函数等来完成它。
答案 1 :(得分:2)
无需循环。
如果块大小将x
:reshape
的长度除以矩阵并取每列的mean
:
n = 10; %// block size. Assumed to divide numel(x)
a = mean(reshape(x, n, []));
在一般情况下,最后一个块可能更小:使用整数值标记每个块并使用这些标签应用accumarray
:
a = accumarray(ceil((1:numel(x))/n).', x(:), [], @mean).';
或者使用vec2mat
(通讯工具箱)构建一个矩阵,其中NaN
作为最后一个块的填充值,然后应用nanmean
计算意味着忽略NaN
:
a = nanmean(vec2mat(x, n, NaN).', 1);
或直接填写:
a = nanmean(reshape([x(:); NaN(mod(mod(-numel(x),n),n),1)], n, []));