0

当以下行作为 parfor 循环的一部分执行时,即使 G 矩阵是病态的,它也会执行。

betas = G\data.y2.';

但是,当我尝试将其作为常规 for 循环的一部分运行时,代码会停止执行,并报告 Matrix 是单数的。

为什么 for 和 parfor 循环处理它的方式不同?

我问的原因是我正在调试其他人编写的一些代码。我无法调试 parfor,所以我希望通过查看 for 等价物来了解发生了什么。

有没有一种方法可以调试并行代码,我可以期望代码的行为与并行环境中的行为相同?

还有什么data.y2.;意思是相对于data.y2'

此外,我有一个旧版本的代码,旨在纯粹在常规 for 循环中运行。

当我回去运行时,我得到了停止代码运行的相同错误。

但是,当我重新启动 MATLAB 并再次运行它时,它运行没有问题。它只是将奇异矩阵的反转结果变为NaN并继续(这就是我想要的)。

在并行版本中,进行了以下声明:

warnState(1) = warning('error', 'MATLAB:singularMatrix'); 
warnState(2) = warning('error', 'MATLAB:illConditionedMatrix'); 

这些是导致代码停止的原因吗?如果是这样,为什么它们不影响并行版本?

4

1 回答 1

1

普通桌面 MATLAB 和 Parallel Computing Toolbox 工作程序之间的一个区别是桌面 MATLAB 运行多线程,而工作程序运行在单计算线程模式下。我相信这可能会导致一些轻微的数字差异。您可以尝试使用启动桌面 MATLAB

matlab -singleCompThread

看看常规 MATLAB 是否可以表现出相同的行为。

在 MATLAB 中,.'运算符是TRANSPOSE,并且'CTRANSPOSE- 复共轭转置。

于 2013-04-10T07:13:09.530 回答