2011-11-27 77 views
0

我想知道是否有某种方法来向量化此代码。我努力做到这一点......但失败了。While循环向量化

while (delta_F > e) && (i < maxLoop)  
    x1 = x0+d; 
    y0 = f(x0); 
    y1 = f(x1); 
    if y1 < y0 
     x0= x1; 
     d = a*d; 
    else 
     vF = [vF;x1]; 
     d = -b*d; 
    end 
    i = i + 1; 
    if length(vF) > 1 
     ultm = vF(end); 
     pultm = vF(end-1); 
     delta_F = abs(ultm+pultm)/2; 
    end 
end 

这是一个Rosenbrock方法的简单实现,用于查找函数的最小值。

+1

这将有助于如果你能告诉我们什么环路是应该做的 - 你可以把它写成一个公式?此外:所有这些变量的初始值是什么? – Thilo

回答

2

一般来说,Matlab的矢量化工作在固定大小的数组/矩阵上。如果你想以其他方式加速这段代码,你可以做的最重要的事情就是在循环的每次迭代中重复使用以前的结果,并去掉无关的变量。

y0 = f(x0); 
while (delta_F > e) && (i < maxLoop) 
    x1 = x0+d; 
    y1 = f(x1); 
    if (y1 < y0) %# new starting point, so swap points 
     x0 = x1; 
     y0 = y1; 
     d = a*d; 
    else   %# same starting point, refine step and see if we're done 
     d = -b*d; 
     delta_F = abs(x1-x0)/2; 
    end 
    i = i+1; 
end 

这消除了f一半的来电和vF的动态调整,这是缓慢的窘况,特别是作为vF变大。

+0

我看起来没有足够接近,看看这是否产生了与原始代码相同的结果,但+1取消了动态调整大小以及由此产生的二次时间损失! –