2015-08-17 3 views
0

Я хочу, чтобы итератировать все элементы независимо (одинаковое условие для всех элементов). Я хочу остановить итерацию, когда значение перестает меняться. Я отправлю часть своего кода. Согласно некоторым исследованиям, я подумал, что это также можно сделать с помощью цикла parfor, но я не знаю, как его реализовать. Может кто-нибудь исправить мой код? Заранее спасибо.Параллельная независимая итерация элементов в массиве

probability = (ones(1,2048) .* 1/2048); 

Tij = sum(StateTransitionfwd); %gives us an array of 2048 elements. 

probability = ((probability * StateTransitionbwd) - (Tij .* probability)); 

threshold = (ones(1,2048) .* 0.05); 

old = zeros(1,2048); 

new = zeros(1,2048); 

while(1) 

    probability = ((probability * StateTransitionbwd) - (Tij .* probability)); 

    new = probability; 

    if old-new <= threshold 

     break 
    end 
    old = probability; 

end 

Поэтому в основном я хочу, устойчивое состояние вероятности (где она не меняющаяся больше)

ответ

0

Для одного вы не можете parallellise в то время как петля.

Для реализации цикла parfor убедитесь в следующем: - Все переменные должны быть определены до цикла парфор. Таким образом, определите выходные переменные перед циклом. - Все итерации должны быть абсолютно независимыми друг от друга.

Второе условие не выполняется в вашем случае, так как вы постоянно обновляете переменную new, делая ее не независимой.

Я не хотел даже parallellise этого кода, так как он предназначен, чтобы разбить, прежде чем он прошел через все элементы, но ради аргумента Постараюсь это:

parfor ii = 1:length(Tij) 
    probability{ii} = ((probability * StateTransitionbwd) - (Tij .* probability)); 
end 

Либо использовать клетку или матрица, в зависимости от того, что более полезно для вашей работы. Теперь вы можете пойти дальше и использовать простой if найти свой порог:

for ii = 1:length(probability)-1 
    if probability(ii+1)-probability(ii)<threshold 
     break 
    end 
end 

Как для остановки в то время как петля условия: это опасно, чтобы бежать цикл неконтролируемого некоторое условия, как и вы. Достаточно легко застревать в бесконечном цикле. Используйте дополнительное условие MaxIt для максимального количества итераций, которые необходимо выполнить перед завершением, независимо от другого условия.

while probability<threshold && MaxIt<someNumber 
    your code 
end 

Также вы проверяете достоверность полного массива.

A = logical([1;0]); 
while A 
    B=1; 
end 
C = logical([1;1]); 
while C 
    D=1; 
end 

Первый цикл while не будет работать, поскольку одна из его записей неверна; второй цикл представляет собой бесконечный цикл. Если вы хотите прервать каждую строку, как только условие будет выполнено, поместите цикл while внутри цикла for через каждую строку. Этот forloop может быть параллелизирован, если вы поместите цикл while в функцию, см. Документацию parfor для этого.

+0

@visser Большое спасибо за то, что нашли время. Вы правы, что не работает. Могу ли я спросить предложение, что делать, поскольку у меня нет подсказки. Я просто хочу повторить все элементы (вероятности) в массиве, независимом друг от друга. Я хочу, чтобы они остановились, когда достигнута конвергенция, которая достигнет в разное время для всех элементов. Ану предложение будет действительно очень полезно. –

+0

Вы не можете самостоятельно вычислять вещи, которые останавливаются при достижении конвергенции, что нарушает условие «каждая итерация должна быть независимой». Не параллелизуйте этот код, просто придерживайтесь цикла while, поскольку он, вероятно, быстрее. Параллельная версия, представленная мной, все еще вычисляет все, а затем должна искать условие, в отличие от исходного цикла while, который выполняет расчет, а затем проверяет правильность инструкции break. Петли Parfor не выполняются последовательно, например. он может сделать ii = 1 5 3 4 2 как итерации вместо ii = 1 2 3 4 5, которые вы хотите. – Adriaan

+0

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