Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 以编程方式确定是否在parfor与for循环内执行_Matlab_Parfor - Fatal编程技术网

Matlab 以编程方式确定是否在parfor与for循环内执行

Matlab 以编程方式确定是否在parfor与for循环内执行,matlab,parfor,Matlab,Parfor,在开发parfor循环时,通常最好从串行循环开始,使用小数据集进行测试,然后添加“par”若要扩展到大样本集等,当串行运行时,最好获取有关for循环每次迭代的诊断信息,但当使用parfor循环获取大数据集时,应关闭诊断信息 所以问题是:有没有任何方法可以通过编程来检测是在for循环中执行还是在parfor循环中执行?这种方式可能类似于if~isParfor;fprintf(…);结束是的,你可以!使用将告诉您是否正在对辅助进程执行操作。检查以下代码以获得简单的演示: clc clear all

在开发parfor循环时,通常最好从串行循环开始,使用小数据集进行测试,然后添加“par”若要扩展到大样本集等,当串行运行时,最好获取有关for循环每次迭代的诊断信息,但当使用parfor循环获取大数据集时,应关闭诊断信息

所以问题是:有没有任何方法可以通过编程来检测是在for循环中执行还是在parfor循环中执行?这种方式可能类似于
if~isParfor;fprintf(…);结束

是的,你可以!使用将告诉您是否正在对辅助进程执行操作。检查以下代码以获得简单的演示:

clc
clear all


A1 = zeros(10,10);
A2 = zeros(10,10);

Check1 = zeros(1,10);
Check2 = zeros(1,10);


parfor ix = 1:10
    Check1(ix) = ~isempty(getCurrentTask());
    myTemp = zeros(1,10);

    for jx = 1:10                
        myTemp(jx) = ix + jx;
    end
    A1(ix,:) = myTemp;
end
clear myTemp

for ix = 1:10

   Check2(ix) =  ~isempty(getCurrentTask());

    myTemp = zeros(1,10);


    for jx = 1:10
        myTemp(jx) = ix + jx;
    end
    A2(ix,:) = myTemp;
end

Check1
Check2
输出如下:

Check1 =

     1     1     1     1     1     1     1     1     1     1

Check2 =

     0     0     0     0     0     0     0     0     0     0

因此,可以只检查“check”变量的第一个条目(即在任何一种情况下的第一次迭代中),并推断您是否(1)在parfor循环中。

您可以使用未记录的命令
功能('isdmlworker')
来确定代码是否正在一个worker上运行。如果在worker上运行,则返回
true
,否则返回
false
。请注意,尽管此命令已存在很长时间,并且看起来很稳定,但它在理论上没有文档记录,并且可能会发生更改

或者,您可以使用文档化的
usejava(“桌面”)
,如果您使用MATLAB桌面运行,则返回
true
,否则返回
false
(对于工作人员来说就是这样)。这是一个相当好的近似工作者,只要您有时不在没有桌面的情况下运行MATLAB本身(即,使用
-nodesktop
选项启动它)


还要注意的是,如果您没有启动一个worker池,
parfor
在本地运行,就像一个
for
循环一样,因此这两个循环都将返回
false
——我想这可能是您想要的,但无论如何都值得注意。

这非常适合在串行而非并行工作的通用函数中使用,像绘图和文字到语音。当分析功能无法运行时,它将优雅地保持惰性

function b = isParfor()
    %returns 1 if in a parfor loop
    b = ~isempty(getCurrentTask());
end