Хотя цикл векторизации - PullRequest
0 голосов
/ 27 ноября 2011

Я хотел бы знать, есть ли способ векторизации этого кода. Я так старался это сделать ... но не получилось.

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

Это простая реализация метода Розенброка для нахождения минимума функции.

1 Ответ

2 голосов
/ 27 ноября 2011

В общем случае векторизация 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 становится большим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...