有人可以帮助我矢量化/加速这个Matlab循环吗?

时间:2013-11-26 22:55:06

标签: performance matlab loops optimization vectorization

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

这里发生了什么:

  1. 遍历s1中的每个值。对于每个值,获取s1的切片 直到s1 + windowSize。
  2. 对s2执行相同操作,仅在中间增量后获取切片。
  3. 如果两个切片中的任何一个切片中没有NaN,并且它们不是平的, 然后得到它们之间的关联,并将其添加到 相关矩阵。

1 个答案:

答案 0 :(得分: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

这就是你想要做的,对吧? 移动窗口关联功能?这确实是一个非常有趣的问题......