您好我正在使用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
Armadillo 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
现在,我不知道在我的C ++代码翻译中是否有一些错误引起了一点点不精确(0.039
接近0.041
),或者它们应被视为双精度之间的正常差异g ++和MATLAB
在我的代码中,我使用了很多这样的循环:
xi_summed = xi_summed + normalise((trans % (alpha.col(t) * b.t())));
其中xi_summed
,trans
,alpha
,b
为arma::mat
,%
为逐元素乘法,{{1} transpose和normalize是一个函数,它使矩阵mat::t()
数组的条目总和为A
。
答案 0 :(得分:3)
这肯定不是正常的差异!
机器epsilon将比你得到的误差小几个数量级(即2.22e-016 vs. 2.0e-3)。
您可以使用以下C ++代码确认您的机器epsilon:
#include <limits>
cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl;
您的Matlab脚本将受到相同的限制;您可以通过在Matlab命令窗口中输入以下内容来确认:
eps
如果您在Matlab和C ++中执行的计算在数学上是等效的,那么您应该获得相同的结果 - ,尤其是4 d.p.精度!
答案 1 :(得分:2)
通常精度要好得多,你可以通过输入eps
来找出matlab的精度。对我而言,2.2204e-16
。
然而,它也很大程度上取决于你正在做的微积分。
例如,如果计算两个非常大的数字的差异,并且差异非常小,那么您的精确度将非常差。
确实,eps
是相对精确度。
因此,如果您键入eps(n)
,您将获得给定值的精度。
例如,eps(10^16)
为2
。因此,对于数字大小为10^16
的操作,精度将为2
。