Ismember,嵌入式循环,数组大小花费的时间太长

时间:2019-06-10 09:10:50

标签: arrays matlab for-loop parallel-processing runtime

我有一个代码旨在在36名个人玩家的比赛中发现未来第三回合(R3)对决的可能性。 R1中有12个3人对抗赛,而这些R1竞赛之一的失败者被推入淘汰赛第2轮,其中有4个3人对抗赛。 R1和R2的第1和第2前进到R3,并带有一些额外的花式播种规则(基于R1和R2的结果)。

我的代码有几个嵌入式的for循环;每次比赛都有一个循环,因此R1中的12个在R2中另外包含4个,然后在R3中包含16个(第3轮被分成16个2人对战)。

我的问题是,尽管我确定自己的脚本可以工作,但计算时间却太长了……我大约需要2年!我将最多时间的任务缩小为几件事:

  1. 尽管读到嵌入式for循环可能很慢,但我之所以使用它们是因为它们允许我捕获R2对R1的依赖关系,以及随后的R3对R1和R2的依赖关系。我不确定我的系统是否可以处理parfor循环(尽管阅读过它们,但从未使用过它们),但是在尝试时,我警告我在循环中生成的多个向量与parfor-loop不兼容。我理解到一定程度,因为使用if语句检查每个索引都会改变它们。

  2. 尽管阅读了每次迭代更改大小的数组可能会很慢,但我不知道另一种处理此问题的方法。对于在迭代过程中发现的每个匹配(R2H1,R2H2等),我无法确定是否已在较早的迭代中发现它。因此,首先我需要使用ismember(我的代码中最慢的操作!)检查它是否已经在数组(R2Heats)中,如果不是,则向该数组中添加一行以更改大小。如果是,我将在其对应的行中以+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

0 个答案:

没有答案