【问题标题】:MATLAB: variable progress is uninitialized temporary not reductionMATLAB:变量进度是未初始化的临时而不是减少
【发布时间】:2015-06-26 06:26:52
【问题描述】:

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

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 中的并行 for 循环,“临时变量旨在 减少变量”。

如何解决?

【问题讨论】:

    标签: matlab loops parallel-processing parfor


    【解决方案1】:

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

    progress = progress + 1;
    

    由于该表达式的精确形式而变得有意义(即它识别了操作的关联性质)。执行parfor 循环体的工作人员之间无法进行通信,因此在循环完成之前无法确定progress 的整体值。

    如果您想以这种方式显示进度,您可能希望使用parfeval 进行调查,它允许您将工作异步提交给工作人员,并在客户端监控整体进度。这是一个例子in the documentation

    【讨论】:

    • 非常感谢。您能否将建议的方法放入上面的代码中? (我不知道如何使用它)
    • @zahmati 你看过我在文档中链接的例子吗?这向您展示了如何通过调用parfeval 来执行循环体来创建多个parallel.Future 对象。回到客户端,你循环调用fetchNext,每次返回,你知道另一个Future已经完成,所以你可以显示进度。
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2021-11-11
    相关资源
    最近更新 更多