2011-11-27 5 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

원래의 코드와 동일한 결과가 나오는지 충분히 알 수 없지만 동적 크기 조정과 결과로 발생하는 2 차 시간 페널티를 없애기 위해 +1했습니다! –