2

嗨,我正在使用armadillo用于线性代数和矩阵的库将脚本从 MATLAB 重写为 C++。

为了获得或多或少相同的输出,我调用了 cout 方法:

cout.precision(4);
cout.setf(ios::fixed);

但我得到了不同的结果:

Matlab结果:

0.0000    0.0000    0.0000    0.0000    0.0000   
0.0012    0.0014    0.0016    0.0020    0.0281  
0.0396    0.0297    0.0297    0.0495    0.0976  

犰狳 c++ 结果:

0.0000    0.0000    0.0000    0.0000    0.0000 
0.0012    0.0014    0.0016    0.0020    0.0282 
0.0416    0.0312    0.0312    0.0520    0.1027

现在,我不知道这些小不精确(0.039接近0.041)是否是由我翻译的 C++ 代码中的一些错误引起的,或者它们应该被视为 g++ 和 MATLAB 中双精度之间的正常差异

在我的代码中,我使用了很多这样的循环:

xi_summed = xi_summed + normalise((trans % (alpha.col(t) * b.t())));

其中xi_summed, trans, alpha,barma::mat并且%是逐元素乘法 并且mat::t()是 transpose 和 normalize 是使矩阵A数组的条目总和为的函数1

4

2 回答 2

3

这当然不是正常的区别!

机器 epsilon 将比您得到的误差小几个数量级(即 2.22e-016 与 2.0e-3)。

您可以使用以下 C++ 代码确认您的机器 epsilon:

#include <limits>

cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl;

您的 Matlab 脚本将受到同样的限制;您可以通过在 Matlab 命令窗口中输入以下内容来确认这一点:

eps

如果您在 Matlab 和 C++ 中执行的计算在数学上是等效的,那么您应该获得相同的结果——尤其是 4 dp 精度!

于 2012-02-16T13:28:45.763 回答
2

通常精度要好得多,你可以通过键入来找出matlab的精度eps。对我来说是2.2204e-16

但是,它也很大程度上取决于您正在做的微积分。

例如,如果您计算两个非常大的数字的差值,而差值非常小,那么您的精度会很差。

的确,eps是一个相对的精度。因此,如果您键入eps(n),您将获得给定值的精度。

例如,eps(10^16)2。所以对于数字这么大的运算10^16,精度将是2.

于 2012-02-16T13:01:08.847 回答