matlab - MATLAB 问题中的 Parfor

标签 matlab

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

parfor i=1:r

    for j=1:N/r

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

    end

end

这是错误:

Error: The variable xr in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".

最佳答案

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

MATLAB workers evaluate iterations in no particular order, and independently of each other. Because each iteration is independent, there is no guarantee that the iterations are synchronized in any way, nor is there any need for this.

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

parfor i=1:100
    i
end

您会发现排序是任意的。因此,如果您将并行作业分配给不同的工作人员,则一个工作人员无法判断不同的迭代是否已完成。因此,您的变量索引不能取决于迭代器的过去/ future 值。

让我用一个简单的例子来演示这一点。考虑斐波那契数列1,1,2,3,5,8,...。您可以轻松生成该系列的前 10 项(在简单的 for 循环中),如下所示:

f=zeros(1,10);
f(1:2)=1;
for i=3:10
    f(i)=f(i-1)+f(i-2);
end

现在让我们对 parfor 循环执行相同的操作。

f=zeros(1,10);
f(1:2)=1;
parfor i=3:10
    f(i)=f(i-1)+f(i-2);
end

??? Error: The variable f in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview"

但是为什么会出错呢?

我已经证明迭代是按任意顺序执行的。假设工作线程获取循环索引 i=7 和表达式 f(i)=f(i-1)+f(i-2);。现在应该执行表达式并将结果返回到主节点。现在迭代i=6完成了吗? f(6) 中存储的值可靠吗? f(5) 怎么样?你明白我的意思吗?假设 f(5)f(6) 没有完成,那么您将错误地计算出斐波那契数列中的第 7 项为 0!

由于 MATLAB 无法判断您的计算是否可以保证正确运行并每次都能重现相同的结果,因此明确不允许此类不明确的赋值。 p>

关于matlab - MATLAB 问题中的 Parfor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369037/

相关文章:

Python:使用 h5py 和 NumPy 从 MATLAB .mat 文件读取 str 时出现问题

python - 如何将 Python 转义字符与 MatLab 命令结合起来?

matlab - 包含 MATLAB 图轴的框中缺少黑线

MATLAB - 将向量转换为单位向量

python - 在给定概率函数的情况下绘制贝叶斯决策边界的内置函数

matlab - 如何在 MATLAB 中将矩阵乘以标量值

excel - 如何将图像从 MATLAB 导出到 excel?

string - 包含多个模式中每个模式的单独结果

matlab - 散点图可视化matlab中的相同点

matlab - 我的六面体单元刚度矩阵计算有什么问题?我正在使用有限元方法。 Matlab 中的 MWE