2013-11-26 89 views
-2
correlation = zeros(length(s1), 1); 
sizeNum = 0; 
for i = 1 : length(s1) - windowSize - delta  
    s1Dat = s1(i : i + windowSize); 
    s2Dat = s2(i + delta : i + delta + windowSize); 
    if length(find(isnan(s1Dat))) == 0 && length(find(isnan(s2Dat))) == 0 
     if(var(s1Dat) ~= 0 || var(s2Dat) ~= 0) 
      sizeNum = sizeNum + 1; 
      correlation(i) = abs(corr(s1Dat, s2Dat))^2; 
     end    
    end 

end 

這裏發生的事情:通過S1的每個值有人可以幫助我矢量化/加快這個Matlab循環?

  1. 運行。對於每個值,獲得s1 的分片,直到s1 + windowSize。
  2. 對s2做同樣的事情,只有在中間變化之後才能得到切片。
  3. 如果兩個切片中的任何一箇中沒有NaN並且它們不是平的,則 然後獲得它們之間的相關性並將其添加到 相關矩陣。
+0

請解釋或刪除'if(correlation(i)> 0.85),結束' – Daniel

+0

好的,完成了。有什麼方法可以對此進行矢量化嗎?對不起,我對Matlab很新。 –

+0

什麼是'length(isnan(s1Dat))'?是不是總是和'length(s1Dat)'一樣?這段代碼是怎麼回事? – Shai

回答

1

這不是一個答案,我想了解什麼被問到。

採取一些數據:

N = 1e4; 
s1 = cumsum(randn(N, 1)); s2 = cumsum(randn(N, 1)); 
s1(randi(N, 50, 1)) = NaN; s2(randi(N, 50, 1)) = NaN; 
windowSize = 200; delta = 100; 

計算的相關性:

tic 
corr_s = zeros(N - windowSize - delta, 1); 
for i = 1:(N - windowSize - delta) 
    s1Dat = s1(i:(i + windowSize)); 
    s2Dat = s2((i + delta):(i + delta + windowSize)); 
    corr_s(i) = corr(s1Dat, s2Dat); 
end 
inds = isnan(corr_s); 
corr_s(inds) = 0; 
corr_s = corr_s .^ 2; % square of correlation coefficient??? Why? 
sizeNum = sum(~inds); 
toc 

這是你想要做什麼,對不對? A 移動窗口相關函數?這確實是一個非常有趣的問題...

+0

是的。這正是我正在做的。只需檢查窗口,看看它是否有效。 –

+0

哦,我只是得到平方相關,因爲它處理 - 斜坡。 –

+0

請注意,您不需要在循環內檢查 - 一旦循環完成,您可以在外部進行檢查。這個廣場也一樣,你可以在外面做。同樣,SizeNum可以在循環外部獲得。如果您使用實數,則使用「abs」是沒有用的。 – randomatlabuser