matlab与c++;精确 我用Matlab到C++编写了一个脚本,使用 ARMADILO 库,用于线性代数和矩阵。
为了获得大致相同的输出,我调用了cout方法:matlab与c++;精确 我用Matlab到C++编写了一个脚本,使用 ARMADILO 库,用于线性代数和矩阵。,c++,matlab,double-precision,C++,Matlab,Double Precision,为了获得大致相同的输出,我调用了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 接近代码> 0.041代
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_summated
,trans
,alpha
,b
是arma::mat
,%
是元素乘法,mat::t()
是转置,而normalise是一个函数,它使矩阵a
数组的条目总和为1
通常精度更好,您可以通过键入eps
来了解matlab的精度。对我来说是2.2204e-16
然而,这也很大程度上取决于你所做的微积分
例如,如果你计算两个非常大的数字的差值,而差值非常小,那么你的精度将非常差
实际上,eps
是一个相对精度。
因此,如果您键入eps(n)
,您将获得给定值的精度
例如,
eps(10^16)
是2
。因此,对于大小为10^16
的运算,精度将为2
这肯定不是正常的差异
机器ε将比您得到的误差小几个数量级(即2.22e-016与2.0e-3)
<>你可以用下面的C++代码确认你的机器ε:
#include <limits>
cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl;
如果你在Matlab和C++中的计算在数学上是等价的,那么你应该得到相同的结果——特别是4的精度。P>当然不是看起来像正常的差异。我想重写HMM工具包的一些功能,并且有超过500行的C++代码。我不知道是哪一行,因为我不知道错误应该在哪里如果你的问题是病态的,那么算法中的细微差异可能会导致非常不同的结果。操作顺序可以。我如何检查C++中的精度设置,在C++中。双变量是64位的,因此精度应该在
2^-64=5e-20
左右。同样的浮点应该有大约<代码> 2 ^ 32=2E-10精度,所以如果我想要Matlab具有相同的C++精度,我必须写EPS(5E-20)。但是我的不同结果呢?因为你是由不同的精度造成的,或者错误在其他地方?这可能是因为一个错误。。。通常情况下,机器的精度不会造成太大的差异。
eps