复位循环索引/重启循环 - MATLAB

时间:2014-03-20 13:58:33

标签: matlab loops parallel-processing parfor

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

我知道这可以使用while循环完成,但是我需要使用并行工具箱parfor(很可能也是GPU' s),据我所知它并没有&# 39; t支持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

1 个答案:

答案 0 :(得分:2)

您可以做的是运行整批,在数组中累积每个传递的独立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以更改批量大小并控制浪费工作之间的权衡(由于最后一批中的“碎片”,cc将使其与较小的批次达到100)并行化的开销。