重置回路索引/重新启动回路-MATLAB

重置回路索引/重新启动回路-MATLAB,matlab,loops,parallel-processing,parfor,Matlab,Loops,Parallel Processing,Parfor,我需要在1000个批次中运行for循环。但是,如果“cc”在第一次运行期间没有达到100,我需要重新运行更多批次的1000,直到cc达到100 我知道这可以通过使用while循环来实现,但是我需要使用并行工具箱parfor(也很可能是GPU),据我所知,它不支持while循环 本质上,我需要更改(重置)if循环内的for循环索引。然而,显然,MATLAB的for循环是这样设计的,这样你就不能改变它的索引,在这种情况下,“i”,在循环中。有办法解决这个问题吗?必须有一种更聪明的方法来做到这一点,而

我需要在1000个批次中运行for循环。但是,如果“cc”在第一次运行期间没有达到100,我需要重新运行更多批次的1000,直到cc达到100

我知道这可以通过使用while循环来实现,但是我需要使用并行工具箱
parfor
(也很可能是GPU),据我所知,它不支持while循环

本质上,我需要更改(重置)if循环内的for循环索引。然而,显然,MATLAB的for循环是这样设计的,这样你就不能改变它的索引,在这种情况下,“i”,在循环中。有办法解决这个问题吗?必须有一种更聪明的方法来做到这一点,而不必使用while循环。有什么建议吗

for i=1:1000

    if (abs(i) <= gamma)
        % etc..
        cc = cc + 1;
    end

    if cc < 100
        i = 1;
    end

end
i=1:1000时的


如果(abs(i)您可以做的是运行一整批,将每个过程的独立
cc
指示符累积在一个数组中,然后将
parfor
之外的结果合并,以查看是否需要继续。这使循环的每个过程独立于其他过程的结果,因此可以并行进行

n = 1000;
cc = 0;
isDone = 1;
while ~isDone
    ccs = zeros(1, n);

    parfor i=1:n
        if (abs(i) <= gamma)
            % ...etc..
            ccs(i) = 1;
        end
    end

    cc = cc + sum(ccs);

    isDone = cc >= 100;
end
n=1000;
cc=0;
isDone=1;
而我是斯通
ccs=零(1,n);
parfori=1:n
如果(abs(i)=100;
结束

这将浪费一些工作。您可以调整
n
以更改批大小,并控制浪费工作之间的权衡(由于上一批中的“碎片”,其中
cc
将以较小的批数达到100)与并行化的开销相比。

如果要并行运行,那么在并行线程启动后更改执行的并行线程数量有何意义?并行执行的关键在于每个线程不应该依赖于其他线程。也许应该使用while循环来获得
cc>=100
first,然后并行执行其余操作?@Isaac这就是问题所在,因为“cc”是在for循环内生成的。我可以检查for循环外的cc是否小于100,但如果不是,我需要它再次重复相同的for循环,直到“cc”达到100。对,这样做,然后结束循环。然后在不需要检查的地方启动另一个循环。当你说你想使用并行工具箱时,你的意思是你想把这个
for
循环变成
parfor
循环,这样它就可以在多个工作者之间运行吗?@AndrewJanke是的,希望以后能扩展到GPU,但只要它能与
parfor
一起工作,现在就可以了。