2011-11-27 115 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取消了動態調整大小以及由此產生的二次時間損失! –