在matlab中用间隔分析信号的循环

时间:2014-10-03 14:25:34

标签: matlab loops

我有一个已知的信号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

这将重复信号的总长度。但是,这种方法并不是我想象的最方便。我该如何进行循环?

谢谢!

2 个答案:

答案 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)

无需循环。

  1. 如果块大小将xreshape的长度除以矩阵并取每列的mean

    n = 10; %// block size. Assumed to divide numel(x)
    a = mean(reshape(x, n, []));
    
  2. 在一般情况下,最后一个块可能更小:使用整数值标记每个块并使用这些标签应用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, []));