3

次の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
4

1 に答える 1

3

newTS(m+i*k)基本的に、との間のすべての距離を合計したいnewTS(m+(i-1)*k)ので、次のようなことができます

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

Matlabでの私の経験では、行列演算は通常、forループよりもはるかに高速であることに同意します。私はできるだけそれらを避けようとします。

編集:内側のiループを交換するだけで十分だと思います。mループをnewTSマトリックスに再形成することで置き換えることができるかもしれませんがlasti、それぞれが異なるためm、あなたの場合は注意が必要です。

于 2013-03-05T07:26:26.850 に答える