【问题标题】:A loop to analyze a signal over intervals in matlab在matlab中分析信号间隔的循环
【发布时间】:2014-10-03 14:25:34
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 注意1:11其实是11秒...

标签: matlab loops


【解决方案1】:

很容易循环:

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 我没看到你已经给出了基于reshape的答案,所以我写了我的
【解决方案2】:

不需要循环。

  1. 如果块大小将x:reshape的长度分成一个矩阵,取每一列的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, []));
    

【讨论】:

  • vec2mat 在工具箱中,但使用modreshape 很容易复制,可能值得添加替代方案(即使accumarray 解决方案适用于所有情况
  • @Dan 好主意。更新(我发现了一个使用mod 两次的好方法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多