如何将此for循环(matlab)矢量化

时间:2013-03-05 07:16:22

标签: matlab for-loop vectorization

我很感激有关如何对以下for循环(matlab)进行矢量化的建议:

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

通过向量化,我的意思是使用矩阵运算而不是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

1 个答案:

答案 0 :(得分:3)

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

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

我同意你的看法,根据我使用Matlab的经验,矩阵运算通常比for循环快很多。我尽可能地避免它们。

编辑:我认为替换内部i循环应该足够好了。也许你可以通过重构mnewTS循环替换为矩阵,但由于每个lasti的{​​{1}}不同,所以在你的情况下可能会很棘手。