0

我需要以 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
4

1 回答 1

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)与并行化的开销之间的权衡。

于 2014-03-20T14:16:58.513 回答