如何将其矢量化为循环(matlab)

如何将其矢量化为循环(matlab),matlab,for-loop,vectorization,Matlab,For Loop,Vectorization,对于如何将以下for loop(matlab)矢量化,我非常感谢您的建议: 我所说的矢量化是指使用矩阵运算而不是for循环。我听说矢量化通常比循环更有效、更快 编辑:实际上,我真正想矢量化的内容如下。我把它包括在内,以防一些勇敢的灵魂想尝试一下 for j=1:length(kvec) k=kvec(j); for m=1:k lasti=floor((N-m)/k); Nfact=(N-1)/(lasti*k);

对于如何将以下for loop(matlab)矢量化,我非常感谢您的建议:

我所说的矢量化是指使用矩阵运算而不是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

基本上,你需要求出
newTS(m+i*k)
newTS(m+(i-1)*k)
之间的所有距离之和,所以你可以这样做

summ = sum(abs(diff(newTS(m:k:m+lasti*k))))
我同意你的看法,在我使用Matlab的经验中,对于循环,矩阵运算通常比
快得多。我尽量避开他们


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

您应该指定变量“m”和“k”的大小以及“newTS()”是否也适用于向量。否则这个问题就无法很好地回答。还要指定
newTS
是一个函数还是一个矩阵,您要从中提取元素。如果
newTS
是一个函数,则必须对其进行矢量化,然后才能完全优化此循环。@H.Muster我认为在我刚才进行编辑之后,m和k的大小应该是清晰的。@user57368 newTS是一个列向量,而不是一个函数。此外,我认为代码行
AvgL(j)=平均值(L(:,j))应该在
m
循环之外。请编辑它。我的编辑被拒绝了。谢谢。增量有一些问题:k:但我想我可以根据这个答案来解决。@ben确保
k
是一个整数。是的,k是一个整数。问题是,第i个元素和第i-1个元素之间存在差异,因此我必须找到某种方法,将其中一列偏移一个元素。
summ = sum(abs(diff(newTS(m:k:m+lasti*k))))