【问题标题】:Can someone help me vectorize / speed up this Matlab Loop?有人可以帮我矢量化/加速这个 Matlab 循环吗?
【发布时间】:2013-12-12 08:14:16
【问题描述】:
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 执行相同操作,仅在中间 delta 之后获取切片。
  3. 如果两个切片中的任何一个都没有 NaN 并且它们不是平坦的, 然后得到它们之间的相关性并将其添加到 相关矩阵。

【问题讨论】:

  • 请解释或删除if(correlation(i) > 0.85),end
  • 好了,完成了。有什么办法可以矢量化吗?抱歉,我是 Matlab 的新手。
  • length(isnan(s1Dat)) 是什么?不总是和length(s1Dat)一样吗?这段代码发生了什么???
  • 这是检查 s1Dat 向量中 NaN 的长度。所以,不是。让我编辑它以显示我在做什么。
  • @gran_profaci:您没有检查 nan。 length(isnan([nan,1])) 为 2,取值是 nan 还是 other 无关紧要。

标签: performance matlab loops optimization vectorization


【解决方案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

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

【讨论】:

  • 是的。这正是我正在做的事情。只需检查窗口以查看它是否有效。
  • 哦,我只是得到平方相关,因为它可以处理 -ve 斜率。
  • 请注意,您不需要在循环内进行检查 - 您可以在循环完成后在外部进行检查。广场也一样,你可以在外面做。同样,SizeNum 可以在循环外获得。如果您使用的是实数,则使用 abs 是没有用的。
  • 不!我必须检查一个窗口......它是否有 NaN。
  • 你的问题对我来说不是很清楚:你可以检查 NaNs 在循环结束时 - 你为什么认为你需要检查 在循环内?
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多