3

for在 Matlab 中,是否可以在不使用循环的情况下测量整个信号中信号的局部变化?即,我可以实现以下内容:

window_length = <something>
for n = 1:(length_of_signal - window_length/2)
    global_variance(n) = var(my_signal(1:window_length))
end

以矢量化格式?

4

3 回答 3

1

如果您有图像处理工具箱,则可以使用STDFILT

global_std = stdfilt(my_signal(:),ones(window_length,1));

% square to get the variance
global_variance = global_std.^2;
于 2013-03-10T19:44:30.710 回答
0

检查 Matlab Central 中的“移动窗口标准差”功能。您的代码将是:

movingstd(my_signal, window_length, 'forward').^2

还有移动方差代码,但它似乎被破坏了。

这个想法是使用filter功能。

于 2013-03-10T20:02:51.213 回答
0

您可以创建一个 2D 数组,其中每一行都移动到上面的行,并且行数等于窗口宽度;那么计算方差是微不足道的。这不需要任何工具箱。不确定它是否比for循环快得多:

longSignal = repmat(mySignal(:), [1 window_length+1]);
longSignal = reshape(longSignal(1:((length_of_signal+1)*window_length)), [length_of_signal+1, window_length])';
global_variance = sum(longSignal.*longSignal, 2);
global_variance = global_variance(1:length_of_signal-window_length));

请注意,第二列相对于上面的列向下移动了 1 - 这意味着当我们拥有要在行中操作的数据块时,我采用转置。之后,求和运算符将对第一个维度求和,从而为您提供一个包含所需结果的行向量。但是,有一些数据包装正在进行,所以我们必须限制“好”值的数量。

我现在手边没有 matlab(我在家),所以我无法测试上述内容 - 但我认为一般的想法应该可行。它是矢量化的 - 我不能保证它很快......

于 2013-03-10T19:59:15.760 回答