2012-04-12 105 views
7

在MATLAB中有一个关于parfor的简单问题。我想在我的程序中设置一个标志,以便在parfor和常规for循环之间切换。基本上,我需要这个功能,以便我的代码的某些部分可以在“调试”模式下更新图形,然后当标志关闭时,使用parfor而不用图形更新来提高速度。Matlab PARFOR循环可以以编程方式打开/关闭吗?

所以,我在找一些简单的有此功能:

if (flag) 
    for i = 1:n 
else 
    parfor i = 1:n 
end 

    % Do loop tasks. 

    end 

任何帮助将不胜感激!谢谢!

+0

是否保留的1池大小解决问题了吗? – Mikhail 2012-04-13 01:50:23

+0

不完全是因为parfor限制创建任何图形对象,如图。因此,无论何时我希望输出,我都必须手动编辑函数的代码。 – 2012-04-13 06:34:05

回答

5

不,这是不可能的。但是,如果你能在一个单独的功能包的循环体,你可以有一个parforfor循环调用体内,即

if (flag) 
    parfor i=1:n 
     out(i) = loopBody(i) 
    end 
else 
    for i=1:n 
     out(i) = loopBody(i) 
    end 
end 

或者,让你有,你可以编辑代码,通过parforfor在你的循环之前,这是我经常最终做的。

+2

如果是4月1日,我会评论,比如“我希望MATLAB有'#define's!那么我们可以'#定义LOOP parfor'或'#define LOOP for',我们不会有这个问题! – 2012-04-13 12:08:15

+2

@ Li-aungYip:是的,这确实很方便。 'parfor'很吸引人的调试。不过,我预计R2015a左右的问题已经解决。 – Jonas 2012-04-13 12:13:09

4

当您通过matlabpool close关闭池时,parfor的行为与for类似,并允许所有图形处理。所以你只需要在调试时关闭池。

+0

即使没有工人群体,“parfor”也不会像“for”那样表现。循环迭代的顺序不能保证,它们可以按任意顺序执行。通常,为了确保您不依赖正常顺序中的数据,它们实际上是以* reverse *顺序执行的。 – 2014-05-07 20:22:17

+1

请注意,这不再是完全正确的 - 最近版本的MATLAB和PCT *可以*自动为您打开一个池,因此您可能需要根据我的答案使用可选数量的参数到'parfor'参数。 – Edric 2015-04-16 13:07:35

5

还有一个选择 - 使用可选的参数PARFOR

if flag 
    arg = Inf; 
else 
    arg = 0; 
end 
parfor (idx = 1:n, arg) 
    ... 
end