C++ Matlab与c++;矩阵积:相同的输入,不同的输出
我在x86计算机上的Ubuntu12.04和g++4.6.3中使用Matlab2010。 这就是我制作和输入的方式:C++ Matlab与c++;矩阵积:相同的输入,不同的输出,c++,matlab,double-precision,C++,Matlab,Double Precision,我在x86计算机上的Ubuntu12.04和g++4.6.3中使用Matlab2010。 这就是我制作和输入的方式: #include <Src/Tools/Math/Matrix_nxn.h> #include <iostream> using namespace std; int main() { Matrix_nxn<double,4> A1,A2,Tb,aa; A1[0][0] = 0.999580
#include <Src/Tools/Math/Matrix_nxn.h>
#include <iostream>
using namespace std;
int main()
{
Matrix_nxn<double,4> A1,A2,Tb,aa;
A1[0][0] = 0.99958087959447828; A1[0][1] = 1.7725781974830023e-18;A1[0][2] = 0.028949354900049871; A1[0][3] = 0;
A1[1][0] = -0.028949354900049871; A1[1][1] = 6.1204654815537932e-17;A1[1][2] = 0.99958087959447828; A1[1][3] = 0;
A1[2][0] = 0, A1[2][1] = -1; A1[2][2] = 6.1230317691118863e-17;A1[2][3] = 0.21129000000000001;
A1[3][0] = 0, A1[3][1] = 0; A1[3][2] = 0; A1[3][3] = 1;
A2[0][0] = 0.90634806393366396; A2[0][1] = -0.42253187690835708;A2[0][2] = 0;A2[0][3] = 0;
A2[1][0] = 0.42253187690835708; A2[1][1] = 0.90634806393366396; A2[1][2] = 0;A2[1][3] = 0;
A2[2][0] = 0; A2[2][1] = 0; A2[2][2] = 1;A2[2][3] = 0;
A2[3][0] = 0; A2[3][1] = 0; A2[3][2] = 0;A2[3][3] = 1;
Tb[0][0] = 0.99956387949834924; Tb[0][1] = -0.00016363183229951183; Tb[0][2] = -0.029530052943282908; Tb[0][3] = 0;
Tb[1][0] = 0; Tb[1][1] = 0.99998464792303143; Tb[1][2] = -0.0055411116439683869;Tb[1][3] = 0;
Tb[2][0] = 0.029530506297888514;Tb[2][1] = 0.0055386950515785164; Tb[2][2] = 0.99954853411673616; Tb[2][3] = 0;
Tb[3][0] = 0; Tb[3][1] = 0; Tb[3][2] = 0; Tb[3][3] = 1;
aa = Tb*A1*A2;
cout.precision(25);
cout <<aa[0][0]<<' '<<aa[0][1]<<' '<<aa[0][2]<<' '<<aa[0][3]<<endl
<<aa[1][0]<<' '<<aa[1][1]<<' '<<aa[1][2]<<' '<<aa[1][3]<<endl
<<aa[2][0]<<' '<<aa[2][1]<<' '<<aa[2][2]<<' '<<aa[2][3]<<endl
<<aa[3][0]<<' '<<aa[3][1]<<' '<<aa[3][2]<<' '<<aa[3][3]<<endl;
}
奇怪的是,我在Matlab中用相同的值制作相同的矩阵,得到不同的结果。以下是Matlab代码:
Tb = [0.99956387949834924,-0.00016363183229951183,-0.029530052943282908,0;0,0.99998464792303143,-0.0055411116439683869,0;0.029530506297888514,0.0055386950515785164,0.99954853411673616,0;0,0,0,1];
A1 = [0.99958087959447828,1.7725781974830023e-18,0.028949354900049871,0;-0.028949354900049871,6.1204654815537932e-17,0.99958087959447828,0;0,-1,6.1230317691118863e-17,0.21129000000000001;0,0,0,1];
A2 = [0.90634806393366396,-0.42253187690835708,0,0;0.42253187690835708,0.90634806393366396,0,0;0,0,1,0;0,0,0,1];
aa = Tb*A1*A2;
aa - aaa
ans =
1.0e-16 *
0 -0.555111512312578 0 0
0 0 0 0
0 0 0 0
0 0 0 0
< A>是C++实现的输出。
我知道错误很小,但我想知道问题的原因!我想调试大量代码,需要良好的调试零差值。 < P>我看到你希望从C++代码中获得25位数的精度。使用
double
类型不太可能出现这种情况。使用长双精度
可以获得更好的精度,但可能没有25位那么高
<>:我看到你期望从C++代码中获得25位数的精度。使用
double
类型不太可能出现这种情况。使用长双精度
可以获得更好的精度,但可能没有25位那么高
请参阅:不同值的原因(无论它可能多么微不足道)是matlab和您使用的算法不同 你的算法很简单
O(N^3)
矩阵乘法。有一些特殊的算法可以有效地计算小尺寸矩阵,也有一些复杂的算法比O(N^3)
具有更好的渐近性
如果您感兴趣,请参阅:
O(N^3)
矩阵乘法。有一些特殊的算法可以有效地计算小尺寸矩阵,也有一些复杂的算法比O(N^3)
具有更好的渐近性
如果您感兴趣,请参阅:
Tb = [0.99956387949834924,-0.00016363183229951183,-0.029530052943282908,0;0,0.99998464792303143,-0.0055411116439683869,0;0.029530506297888514,0.0055386950515785164,0.99954853411673616,0;0,0,0,1];
A1 = [0.99958087959447828,1.7725781974830023e-18,0.028949354900049871,0;-0.028949354900049871,6.1204654815537932e-17,0.99958087959447828,0;0,-1,6.1230317691118863e-17,0.21129000000000001;0,0,0,1];
A2 = [0.90634806393366396,-0.42253187690835708,0,0;0.42253187690835708,0.90634806393366396,0,0;0,0,1,0;0,0,0,1];
aa = Tb*A1*A2;
aa - aaa
ans =
1.0e-16 *
0 -0.555111512312578 0 0
0 0 0 0
0 0 0 0
0 0 0 0