在Matlab中,是否可以在不使用for
環路的情況下測量整個信號的信號局部變化?即,我可以執行以下操作:檢測相對於本地活動的信號跳躍
window_length = <something>
for n = 1:(length_of_signal - window_length/2)
global_variance(n) = var(my_signal(1:window_length))
end
以矢量化格式?
在Matlab中,是否可以在不使用for
環路的情況下測量整個信號的信號局部變化?即,我可以執行以下操作:檢測相對於本地活動的信號跳躍
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;
您可以創建一個二維數組每一行移動一個w.r.t.到上面的行,並且行數等於窗口寬度;那麼計算方差是微不足道的。這不需要任何工具箱。不知道這是不是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));
注意,第二列下移一個相對於上面的一個 - 這意味着,當我們擁有的數據塊上,我們要在行中操作,所以我採取轉置。之後,sum運算符將總結第一個維度,從而爲您提供一個包含所需結果的行向量。但是,有一些數據正在打包,所以我們不得不限制「好」值的數量。
我現在沒有matlab方便(我在家),所以我無法測試上述 - 但我認爲一般的想法應該工作。它的矢量化 - 我不能保證它的速度很快...
檢查在Matlab中心"moving window standard deviation" function。您的代碼將是:
movingstd(my_signal, window_length, 'forward').^2
還有moving variance代碼,但它似乎被破壞。
這個想法是使用filter
函數。
你的意思是像'global_variance(n)= var(my_signal(n:n + window_length - 1))'''嗎? – 2013-03-10 18:42:02
@EitanT - 對,對不起,混淆了我的R和Matlab語法,對不起。 – eykanal 2013-03-10 18:55:50
一些可能相關的問題爲其他人尋求更一般的答案:[this](http://stackoverflow.com/q/7991744/168775),[this](http://stackoverflow.com/questions/7974616/simple- sliding-window-filter-in-matlab)和[this](http://stackoverflow.com/questions/2202463/sliding-window-algorithm-for-activiting-recognition-matlab) – eykanal 2013-03-10 20:04:48