Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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:变量进度是未初始化的,而不是减少_Matlab_Loops_Parallel Processing_Parfor - Fatal编程技术网

MATLAB:变量进度是未初始化的,而不是减少

MATLAB:变量进度是未初始化的,而不是减少,matlab,loops,parallel-processing,parfor,Matlab,Loops,Parallel Processing,Parfor,在一个简单的进度指示器中,我更新循环前进的百分比: progress=0; N=10; for k=1:N % .... progress=progress+1; disp(sprintf('progress %d%%',progress/N*100)); end 以及输出: 进度10% 进度20% 进度30% 进步40% 进度50% 进展60% 进度70% 进度80% 进度90% 进度100% 但是,当我尝试将for循环更改为parfor(并行循环)时,我会遇到一个

在一个简单的进度指示器中,我更新循环前进的百分比:

progress=0;
N=10;

for k=1:N
    % ....
    progress=progress+1;
    disp(sprintf('progress %d%%',progress/N*100));
end
以及输出:

进度10%

进度20%

进度30%

进步40%

进度50%

进展60%

进度70%

进度80%

进度90%

进度100%

但是,当我尝试将
for
循环更改为
parfor
(并行循环)时,我会遇到一个错误

progress=0;
N=10;

parfor k=1:N
    % ....
    progress=progress+1;
    disp(sprintf('progress %d%%',progress/N*100));
end
使用测试时出错(第4行)

错误:可变进度可能是为了减少成本 变量,但实际上是未初始化的临时变量

参见MATLAB中的并行循环,“临时变量 减少变量”

如何修复它?

在循环执行期间,无法读取
parfor
中的缩减变量。请记住,循环的所有迭代在概念上都是同时发生的。MATLAB知道如何转换表达式

progress = progress + 1;
由于该表达式的精确形式(即,它识别操作的关联性质),它被转换为有意义的内容。执行
parfor
循环主体的工作人员之间不可能进行通信,因此在循环完成之前,无法确定
progress
的总体值

如果您希望以这种方式显示进度,您可能希望研究使用,它允许您将工作异步提交给工作人员,并在客户端监控总体进度。下面是一个示例。

在循环执行期间,无法读取
parfor
中的缩减变量。请记住,循环的所有迭代在概念上都是同时发生的。MATLAB知道如何转换表达式

progress = progress + 1;
由于该表达式的精确形式(即,它识别操作的关联性质),它被转换为有意义的内容。执行
parfor
循环主体的工作人员之间不可能进行通信,因此在循环完成之前,无法确定
progress
的总体值


如果您希望以这种方式显示进度,您可能希望研究使用,它允许您将工作异步提交给工作人员,并在客户端监控总体进度。这是一个例子。

非常感谢。你能把建议的方法融入上面的代码吗?(我不知道如何使用它)@zahmati您看过我在文档中链接的示例了吗?这显示了如何通过调用
parfeval
执行循环体来创建多个
parallel.Future
对象。回到客户端,您在循环中调用
fetchNext
,每次返回时,您都知道另一个
Future
已完成,因此您可以显示进度。非常感谢。你能把建议的方法融入上面的代码吗?(我不知道如何使用它)@zahmati您看过我在文档中链接的示例了吗?这显示了如何通过调用
parfeval
执行循环体来创建多个
parallel.Future
对象。回到客户端,在循环中调用
fetchNext
,每次返回时,您都知道另一个
Future
已完成,因此可以显示进度。