Matlab 中的数值问题:相同的输入,相同的代码 ->不同的输出?
当我比较具有相同输入的 Matlab 软件不同运行的结果时,我遇到了问题。为了缩小问题范围,我执行了以下操作:
- 使用 Matlab 的 save() 方法保存所有相关变量
- 调用计算结果的方法
- 使用 save() 再次保存所有相关输出变量
在不更改调用的方法的情况下,我再次运行
- 加载变量上面保存并使用 isequal() 与当前输入变量进行比较,
- 使用当前输入变量再次调用我的方法,
- 加载上面保存的输出变量并进行比较。
我不敢相信最后“行”中的比较发现了细微的差异。计算包括单精度和双精度数,误差在1e-10的量级(输出是双精度数)。
我能想到的唯一可能的解释是,Matlab 在保存变量时会丢失一些精度(我认为这不太可能,我使用默认的二进制 Matlab 格式),或者包含像 a=b+c+d 这样的计算,这可以计算为 a=(b+c)+d 或 a=b+(c+d),这可能会导致数值差异。
您知道上述观察结果的原因可能是什么吗?
多谢!
I am experiencing problems when I compare results from different runs of my Matlab software with the same input. To narrow the problem, I did the following:
- save all relevant variables using Matlab's save() method
- call a method which calculates something
- save all relevant output variables again using save()
Without changing the called method, I did another run with
- load the variables saved above and compare with the current input variables using isequal()
- call my method again with the current input variables
- load the out variables saved above and compare.
I can't believe the comparison in the last "line" detects slight differences. The calculations include single and double precision numbers, the error is in the magnitude of 1e-10 (the output is a double number).
The only possible explanation I could imagine is that either Matlab looses some precision when saving the variables (which I consider very unlikely, I use the default binary Matlab format) or that there are calculations included like a=b+c+d, which can be calculated as a=(b+c)+d or a=b+(c+d) which might lead to numerical differences.
Do you know what might be the reason for the observations described above?
Thanks a lot!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这似乎确实是由计算中的单/双混合引起的。由于我只切换到双精度,所以问题不再出现。感谢大家的想法。
it really seems to be caused by the single/double mix in the calculations. Since I have switched to double precision only, the problem did not occur anymore. Thanks to everybody for your thoughts.
这些可能是舍入错误。您可以像这样找到系统的浮点精度:
在我的系统上,此报告为 10^-7,这可以解释您的订单的差异
these could be rounding errors. you can find the floating point accuracy of you system like so:
On my system this reports 10^-7 which would explain discrepancies of your order
为了确保结果可重现,特别是如果您使用任何随机生成函数(直接或间接),您应该在每次运行开始时恢复相同的状态:
To ensure reproducible results, especially if you are using any random generating functions (either directly or indirectly), you should restore the same state at the beginning of each run: