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
已完成,因此可以显示进度。