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

Что здесь происходит:Может кто-нибудь помочь мне векторизовать/ускорить эту петлю Matlab?

  1. Выполнить через каждые значения в s1. Для каждого значения получите фрагмент для s1 до s1 + windowSize.
  2. Сделайте то же самое для s2, получите только срез после промежуточной дельта.
  3. Если в любом из двух фрагментов нет NaN и они не являются плоскими, то получится корреляция между ними и добавьте это в корреляционную матрицу .
+0

Пожалуйста, объясните или удалите 'if (корреляция (i)> 0.85), end' – 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; 

Compute корреляций:

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

О, и я просто получаю квадрат корреляции, так как хорошо, он обрабатывает -ve склоны. –

+0

Обратите внимание, что вам не нужно проверять внутри цикла - вы можете сделать это снаружи, как только цикл будет завершен. То же самое для площади, вы можете сделать это снаружи. Аналогично, SizeNum может быть получен вне цикла. Использование 'abs' бесполезно, если вы работаете с реальными числами. – randomatlabuser

Смежные вопросы