2013-03-10 27 views
3

在Matlab中,是否可以在不使用for環路的情況下測量整個信號的信號局部變化?即,我可以執行以下操作:檢測相對於本地活動的信號跳躍

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

以矢量化格式?

+0

你的意思是像'global_variance(n)= var(my_signal(n:n + window_length - 1))'''嗎? – 2013-03-10 18:42:02

+0

@EitanT - 對,對不起,混淆了我的R和Matlab語法,對不起。 – eykanal 2013-03-10 18:55:50

+0

一些可能相關的問題爲其他人尋求更一般的答案:[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

回答

1

如果您有圖像處理工具箱,你可以使用STDFILT

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

% square to get the variance 
global_variance = global_std.^2; 
0

您可以創建一個二維數組每一行移動一個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方便(我在家),所以我無法測試上述 - 但我認爲一般的想法應該工作。它的矢量化 - 我不能保證它的速度很快...