【问题标题】:How can I vectorize this for loop (matlab)我怎样才能矢量化这个for循环(matlab)
【发布时间】:2013-03-05 07:16:22
【问题描述】:

感谢有关如何矢量化以下 for 循环 (matlab) 的建议:

    summ=0;
    for i=1:lasti
         summ=summ+abs(newTS(m+i*k)-newTS(m+(i-1)*k));
    end

向量化是指使用矩阵运算而不是 for 循环。我听说矢量化通常比 for 循环更有效、更快。

编辑:实际上我真正想要矢量化的内容如下。我把它包括在内,以防一些勇敢的灵魂想试一试......

   for j=1:length(kvec)
       k=kvec(j);
       for m=1:k
           lasti=floor((N-m)/k);
           Nfact=(N-1)/(lasti*k);
           summ=0;
           for i=1:lasti
                summ=summ+abs(newTS(m+i*k)-newTS(m+(i-1)*k));
           end
           L(m,j)=(summ*Nfact)/k;
           %Avg over m
           AvgL(j)=mean(L(:,j));
        end
    end

【问题讨论】:

  • 您应该指定变量“m”和“k”的大小以及“newTS()”是否也适用于向量。否则这个问题不能很好地回答。
  • 还指定newTS 是一个函数还是一个矩阵,您要从中提取元素。如果newTS 是一个函数,则必须先对其进行矢量化,然后才能完全优化此循环。
  • @H.Muster 我觉得 m 和 k 的大小在我刚刚进行的编辑之后应该清楚了。
  • @user57368 newTS 是列向量,而不是函数。
  • 另外,我认为代码行AvgL(j)=mean(L(:,j)); 应该在m 循环之外。请编辑它。我的编辑被拒绝了。

标签: matlab for-loop vectorization


【解决方案1】:

基本上你想总结newTS(m+i*k)newTS(m+(i-1)*k)之间的所有距离,所以你可以做这样的事情

summ = sum(abs(diff(newTS(m:k:m+lasti*k))))

我同意你的观点,根据我使用 Matlab 的经验,矩阵运算通常比 for 循环快得多。我尽量避免它们。

编辑:我认为替换内部 i 循环对你来说应该足够好了。也许您可以通过将newTS 重塑为矩阵来替换m 循环,但由于每个mlasti 都不同,因此在您的情况下可能会很棘手。

【讨论】:

  • 谢谢。增量存在一些问题:k:但我认为我可以根据这个答案解决它。
  • @ben 确保 k 是一个整数。
  • 是的 k 是一个整数。问题是第 i 个元素和第 i-1 个元素之间存在差异,所以我必须想办法将其中一列偏移一个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2021-07-14
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多