【发布时间】:2010-08-31 12:10:22
【问题描述】:
当我将 Matlab 软件的不同运行结果与相同的输入进行比较时,我遇到了问题。为了缩小问题的范围,我做了以下操作:
- 使用 Matlab 的 save() 方法保存所有相关变量
- 调用计算某些东西的方法
- 使用 save() 再次保存所有相关的输出变量
在不改变被调用方法的情况下,我用
再次运行- 加载上面保存的变量并使用 isequal() 与当前输入变量进行比较
- 使用当前输入变量再次调用我的方法
- 加载上面保存的 out 变量并进行比较。
我不敢相信最后“行”中的比较能发现细微的差异。计算包括单精度和双精度数,误差在1e-10的量级(输出为双精度数)。
我能想到的唯一可能的解释是,要么 Matlab 在保存变量时失去了一些精度(我认为这不太可能,我使用默认的二进制 Matlab 格式),要么包括像 a=b+c+d 这样的计算,可以计算为 a=(b+c)+d 或 a=b+(c+d),这可能会导致数值差异。
您知道上述观察结果可能是什么原因吗?
非常感谢!
【问题讨论】:
-
你能提供一个最小的例子吗?它可能高度依赖于您使用的功能。如果路径中的任何函数使用一些随机性,则差异很常见。可能情况并非如此,但一个可重现的例子仍然会给其他人一些可以使用的东西。
-
不幸的是,我调用的方法涉及许多计算步骤,甚至一些我无法共享的代码。我只是想知道这种行为是否是“有效的 Matlab 行为”,或者它是否指向我的代码中的问题。涉及到一些 randn() 调用,但 RandStream 是在每次运行之前设置的,因此它产生相同的值。在从代码中消除单精度数字之后,似乎消除了问题的出现(或降低了可能性??)
-
这是 MATLAB 非常意外的行为。保存变量时是否可能会出现差异?您说您加载变量并进行比较——保存两次运行的结果并比较这些保存的结果怎么样?