我需要以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
答案 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)并行化的开销。