首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中的Parfor问题

MATLAB中的Parfor问题
EN

Stack Overflow用户
提问于 2011-09-10 01:26:06
回答 1查看 4.8K关注 0票数 2

为什么我不能在这段代码中使用parfor

代码语言:javascript
复制
parfor i=1:r

    for j=1:N/r

        xr(j + (N/r) * (i-1)) = x(i + r * (j-1));

    end

end

这是一个错误:

错误:不能对parfor中的变量xr进行分类。参见MATLAB中的并行循环,“概述”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-10 04:12:43

这里的问题是切片数组的索引不正确。asynchronously,运行parfor循环,这意味着每次迭代的执行顺序都是随机的。来自文档

MATLAB工作人员不按特定顺序对迭代进行评估,并且相互独立。因为每个迭代都是独立的,所以不能保证迭代以任何方式同步,也不需要这样做。

通过在命令行中键入以下内容,您可以轻松地验证上述语句:

代码语言:javascript
复制
parfor i=1:100
    i
end

你会发现排序是任意的。因此,如果您在不同的员工之间分割并行作业,那么一个工人就无法判断不同的迭代是否已经完成。因此,变量索引不能依赖于迭代器的过去/未来值。

让我用一个简单的例子来说明这一点。考虑斐波纳契系列1,1,2,3,5,8,...。您可以轻松地生成本系列的前10个术语(在天真的for循环中),如下所示:

代码语言:javascript
复制
f=zeros(1,10);
f(1:2)=1;
for i=3:10
    f(i)=f(i-1)+f(i-2);
end

现在,让我们对一个parfor循环进行同样的操作。

代码语言:javascript
复制
f=zeros(1,10);
f(1:2)=1;
parfor i=3:10
    f(i)=f(i-1)+f(i-2);
end

???错误:不能对parfor中的变量f进行分类。参见MATLAB中的并行循环,“概述”

但是为什么这会产生一个错误呢?

我已经证明迭代是以任意顺序执行的。因此,假设一个工作人员获得循环索引i=7和表达式f(i)=f(i-1)+f(i-2);。现在应该执行表达式并将结果返回给主节点。现在迭代i=6已经完成了吗?存储在f(6)中的值可靠吗?那f(5)呢?你看到我在说什么了吗?假设没有完成f(5)f(6),那么您将错误地计算出Fibonnaci级数中的第七个项是0!

由于MATLAB无法判断您的计算是否能够保证每次都能正确运行并再现相同的结果,因此这种模糊的赋值是明确不允许的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7369037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档