У меня есть код, целью которого является выявление вероятности будущих матчей третьего раунда (R3) в состязании 36 отдельных игроков. В R1 проводится 12 матчей с участием 3 человек, и проигравший один из этих матчей R1 выдвигается на отборочный раунд 2, из которых 4 матча с участием 3 человек. 1-й и 2-й от R1 и R2 прогрессируют до R3 с некоторыми дополнительными необычными правилами посева (на основе результатов R1 & R2).
Мой код имеет несколько встроенных циклов for; один цикл для каждого матча, поэтому 12 в R1, которые содержат еще 4 в R2 и затем 16 в R3 (Раунд 3 разбит на 16 матчей из 2 человек).
Моя проблема в том, что, хотя я уверен, что мой сценарий работает, вычисление занимает слишком много времени ... Примерно 2 года! Я сузил задачи, затратив больше времени на несколько вещей:
Несмотря на чтение, что встроенные циклы for могут быть медленными, я использовал их, потому что они позволяют мне захватить зависимость R2 от R1, а затем последующую зависимость R3 от R1 и R2. Я не уверен, что моя система может обрабатывать циклы parfor (никогда не использовал их, несмотря на то, что читал о них), но когда я пытаюсь, меня предупреждают, что некоторые из векторов, которые я генерирую в своих циклах, не совместимы с циклом parfor .. Я понимаю, что они меняются с каждым индексом, используя операторы if.
Несмотря на чтение, что изменение размера массивов с каждой итерацией может быть медленным, я не знаю другого способа справиться с этой проблемой. Для каждого совпадения (R2H1, R2H2 и т. Д.), Обнаруженного во время итерации, я не могу быть уверен, что оно было обнаружено в более ранней итерации или еще нет. Поэтому сначала мне нужно проверить, находится ли он уже в массиве (R2Heats), используя ismember (самая медленная операция в моем коде!), А если нет, то я добавляю строку в массив, меняя размер. Если это так, я увеличиваю на +1 в соответствующей строке (считая количество совпадений).
Будем очень благодарны за любые предложения!
R2H1=[SortedR2Pool(1) SortedR2Pool(8) SortedR2Pool(12) 1];
R2H2=[SortedR2Pool(2) SortedR2Pool(7) SortedR2Pool(11) 1];
R2H3=[SortedR2Pool(3) SortedR2Pool(6) SortedR2Pool(10) 1];
R2H4=[SortedR2Pool(4) SortedR2Pool(5) SortedR2Pool(9) 1];
if R2Heats==[0 0 0 0]
R2Heats=[R2H1;R2H2;R2H3;R2H4];
else
if ismember([R2H1(1) R2H1(2) R2H1(3)],R2Heats(:,1:3),'rows')
R2Heats(R2Heats(:,1)==R2H1(1) & R2Heats(:,2)==R2H1(2) &
R2Heats(:,3)==R2H1(3),4)=R2Heats(R2Heats(:,1)==R2H1(1) &
R2Heats(:,2)==R2H1(2) & R2Heats(:,3)==R2H1(3),4)+1;
else
R2Heats=[R2Heats;R2H1];
end
if ismember([R2H2(1) R2H2(2) R2H2(3)],R2Heats(:,1:3),'rows')
R2Heats(R2Heats(:,1)==R2H2(1) & R2Heats(:,2)==R2H2(2) &
R2Heats(:,3)==R2H2(3),4)=R2Heats(R2Heats(:,1)==R2H2(1) &
R2Heats(:,2)==R2H2(2) & R2Heats(:,3)==R2H2(3),4)+1;
else
R2Heats=[R2Heats;R2H2];
end
if ismember([R2H3(1) R2H3(2) R2H3(3)],R2Heats(:,1:3),'rows')
R2Heats(R2Heats(:,1)==R2H3(1) & R2Heats(:,2)==R2H3(2) &
R2Heats(:,3)==R2H3(3),4)=R2Heats(R2Heats(:,1)==R2H3(1) &
R2Heats(:,2)==R2H3(2) & R2Heats(:,3)==R2H3(3),4)+1;
else
R2Heats=[R2Heats;R2H3];
end
if ismember([R2H4(1) R2H4(2) R2H4(3)],R2Heats(:,1:3),'rows')
R2Heats(R2Heats(:,1)==R2H4(1) & R2Heats(:,2)==R2H4(2) &
R2Heats(:,3)==R2H4(3),4)=R2Heats(R2Heats(:,1)==R2H4(1) &
R2Heats(:,2)==R2H4(2) & R2Heats(:,3)==R2H4(3),4)+1;
else
R2Heats=[R2Heats;R2H4];
end
end