Performance 有人能帮我矢量化/加速这个Matlab循环吗?

Performance 有人能帮我矢量化/加速这个Matlab循环吗?,performance,matlab,loops,optimization,vectorization,Performance,Matlab,Loops,Optimization,Vectorization,这里发生了什么: 运行s1中的每个值。对于每个值,为s1获取一个切片 直到s1+窗口大小 对s2执行相同的操作,仅在中间增量之后获取切片 如果两片中的任何一片都没有NaN,并且它们不是平的, 然后得到它们之间的相关子,并将其添加到 相关矩阵 这不是一个答案,我试图理解被问到的问题 以一些数据为例: correlation = zeros(length(s1), 1); sizeNum = 0; for i = 1 : length(s1) - windowSize - delta

这里发生了什么:

  • 运行s1中的每个值。对于每个值,为s1获取一个切片 直到s1+窗口大小
  • 对s2执行相同的操作,仅在中间增量之后获取切片
  • 如果两片中的任何一片都没有NaN,并且它们不是平的, 然后得到它们之间的相关子,并将其添加到 相关矩阵

  • 这不是一个答案,我试图理解被问到的问题

    以一些数据为例:

    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
    
    计算相关性:

    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;
    

    这就是你想做的,对吗?移动窗口相关函数?这确实是一个非常有趣的问题…

    请解释或删除
    如果(相关性(i)>0.85),结束
    好的,完成了。有没有办法将其矢量化?对不起,我对Matlab很陌生。长度是多少?它不总是与长度(s1Dat)相同吗?这段代码是怎么回事???这是在检查s1Dat向量中NaN的长度。所以,事实并非如此。让我编辑一下,看看我在做什么。@gran_profaci:你不是在检查nan<代码>长度(isnan([nan,1])为2,如果值为nan或其他值,则不相关。是的。这正是我正在做的。只是在窗口上检查它是否有效。哦,我只是得到平方相关,因为它处理-ve斜率。注意,你不需要在循环内检查-你可以在循环完成后在外部检查。广场也一样,你可以在外面做。类似地,可以在循环外部获得SizeNum。如果你使用的是实数,
    abs
    的使用是没有用的。不!我得去看看有没有窗户。。。你的问题我不清楚:你可以在循环结束时检查NaN,为什么你认为你需要在循环内检查?
    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