Векторизация Matlab нескольких встроенных циклов for

Предположим, у вас есть 5 векторов: v_1, v_2, v_3, v_4 и v_5. Каждый из этих векторов содержит диапазон значений от минимума до максимума. Так, например:

v_1 = minimum_value:step:maximum_value;

Каждый из этих векторов использует один и тот же размер шага, но имеет разное минимальное и максимальное значение. Таким образом, они имеют разную длину.

Функция F(v_1, v_2, v_3, v_4, v_5) зависит от этих векторов и может использовать любую комбинацию элементов внутри них. (Извините за плохое объяснение). Я пытаюсь найти максимальное значение F и записать полученные значения. Мой текущий подход состоял в том, чтобы использовать несколько встроенных циклов for, как показано, чтобы выработать функцию для каждой комбинации элементов векторов:

% Set the temp value to a small value
temp  = 0;

% For every combination of the five vectors use the equation. If the result
% is greater than the one calculated previously, store it along with the values 
% (postitions) of elements within the vectors
for a=1:length(v_1)
    for b=1:length(v_2)
        for c=1:length(v_3)
            for d=1:length(v_4)
                for e=1:length(v_5)
                     % The function is a combination of trigonometrics, summations, 
                     % multiplications etc..
                     Result = F(v_1(a), v_2(b), v_3(c), v_4(d), v_5(e))   
                     % If the value of Result is greater that the previous value, 
                     % store it and record the values of 'a','b','c','d' and 'e'
                     if Result > temp;
                          temp = Result;
                          f    = a;
                          g    = b;
                          h    = c;
                          i    = d;
                          j    = e;
                     end
                end
            end
        end
    end
end

Это становится невероятно медленным для небольших размеров шага. Если в каждом векторе около 100 элементов, количество комбинаций составляет около 100*100*100*100*100. Это проблема, так как мне нужны небольшие значения шага, чтобы получить подходящим сходящимся ответом.

Мне было интересно, можно ли ускорить это с помощью векторизации или любым другим способом. Я также просматривал создание комбинаций до вычисления, но это казалось даже медленнее, чем мой текущий метод. Я не использовал Matlab в течение длительного времени, но просто глядя на количество встроенных циклов for, я думаю, что это определенно можно ускорить. Спасибо за предложения.


person 1QuickQuestion    schedule 25.08.2014    source источник
comment
Вам нужно векторизовать сам F.   -  person Divakar    schedule 25.08.2014
comment
Не могли бы вы рассказать об этом подробнее? Насколько я понимаю, это потребует устранения циклов for и записи a, b, c, d и e в виде векторов. Векторизация F потребует создания огромного массива, когда мне просто нужно максимальное значение. Будет ли это быстрее?   -  person 1QuickQuestion    schedule 25.08.2014
comment
Вы передаете каждый элемент из этих векторов в F, поэтому, чтобы действительно векторизовать вашу проблему, вам нужно изменить F s.t. он принимает эти векторы целиком и работает с ними. Открывая нам F, мы могли бы лучше оценить возможности его векторизации.   -  person Divakar    schedule 25.08.2014


Ответы (1)


Независимо от того, как вы сгенерируете комбинацию параметров, вы в конечном итоге вызовете свою функцию F 100 ^ 5 раз. Самым простым решением было бы использовать вместо этого parfor, чтобы основной расчет. Если вы сделаете это, вы должны сохранить результаты вычислений и найти максимум после цикла, потому что ваш текущий подход не будет потокобезопасным.

Сказав это и ничего не зная о вашей реальной проблеме, я бы посоветовал вам реализовать более структурированный подход, например, сначала найти грубое решение с большим размером шага и последовательно сузить его, уменьшив минимальные/максимальные значения ваших интервалов параметров. . В настоящее время у вас есть метод абсолютной грубой силы, который никогда не будет очень эффективным.

person Peter Sorowka    schedule 25.08.2014
comment
Спасибо за ответ. Ваше второе предложение - это именно то, что я собирался попытаться сделать дальше. Так что это похоже на то, что я переписываю свой первоначальный код, а не пытаюсь сделать его более эффективным. - person 1QuickQuestion; 25.08.2014