4

当我将 Matlab 软件的不同运行结果与相同的输入进行比较时,我遇到了问题。为了缩小问题范围,我做了以下事情:

  • 使用 Matlab 的 save() 方法保存所有相关变量
  • 调用计算某事的方法
  • 使用 save() 再次保存所有相关的输出变量

在不更改被调用方法的情况下,我又运行了一次

  • 加载上面保存的变量并使用 isequal() 与当前输入变量进行比较
  • 使用当前输入变量再次调用我的方法
  • 加载上面保存的 out 变量并进行比较。

我不敢相信最后“行”中的比较检测到细微的差异。计算包括单精度和双精度数,误差在 1e-10 的量级(输出为双精度数)。

我能想象的唯一可能的解释是,Matlab 在保存变量时会丢失一些精度(我认为这不太可能,我使用默认的二进制 Matlab 格式),或者包含像 a=b+c+d 这样的计算,这可以计算为 a=(b+c)+d 或 a=b+(c+d),这可能会导致数值差异。

您知道上述观察结果的原因可能是什么吗?

非常感谢!

4

3 回答 3

1

这似乎真的是由计算中的单/双混合引起的。由于我只切换到双精度,因此问题不再发生。感谢大家的想法。

于 2010-09-01T06:45:58.247 回答
0

这些可能是舍入错误。您可以像这样找到系统的浮点精度:

>> eps('single')

ans =

  1.1921e-07

在我的系统上,这会报告 10^-7,这将解释您的订单的差异

于 2010-08-31T12:49:08.583 回答
0

为了确保可重现的结果,特别是如果您使用任何随机生成函数(直接或间接),您应该在每次运行开始时恢复相同的状态:

%# save state (do this once)
defaultStream = RandStream.getDefaultStream;
savedState = defaultStream.State;
save rndStream.mat savedState

%# load state (do this at before each run)
load rndStream.mat savedState
defaultStream = RandStream.getDefaultStream();
defaultStream.State = savedState;
于 2010-08-31T14:58:00.957 回答