2013-11-26 63 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