for
在 Matlab 中,是否可以在不使用循环的情况下测量整个信号中信号的局部变化?即,我可以实现以下内容:
window_length = <something>
for n = 1:(length_of_signal - window_length/2)
global_variance(n) = var(my_signal(1:window_length))
end
以矢量化格式?
for
在 Matlab 中,是否可以在不使用循环的情况下测量整个信号中信号的局部变化?即,我可以实现以下内容:
window_length = <something>
for n = 1:(length_of_signal - window_length/2)
global_variance(n) = var(my_signal(1:window_length))
end
以矢量化格式?
如果您有图像处理工具箱,则可以使用STDFILT:
global_std = stdfilt(my_signal(:),ones(window_length,1));
% square to get the variance
global_variance = global_std.^2;
检查 Matlab Central 中的“移动窗口标准差”功能。您的代码将是:
movingstd(my_signal, window_length, 'forward').^2
还有移动方差代码,但它似乎被破坏了。
这个想法是使用filter
功能。
您可以创建一个 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(我在家),所以我无法测试上述内容 - 但我认为一般的想法应该可行。它是矢量化的 - 我不能保证它很快......