Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Matlab与c++;矩阵积:相同的输入,不同的输出_C++_Matlab_Double Precision - Fatal编程技术网

C++ Matlab与c++;矩阵积:相同的输入,不同的输出

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

我在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.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)
具有更好的渐近性

如果您感兴趣,请参阅:


不同值的原因(无论它可能多么微不足道)是matlab和您使用的算法不同

你的算法很简单
O(N^3)
矩阵乘法。有一些特殊的算法可以有效地计算小尺寸矩阵,也有一些复杂的算法比
O(N^3)
具有更好的渐近性

如果您感兴趣,请参阅:


事实上,我不需要太高的计算精度,但我不希望有任何错误!由于Matlab使用双IEEE 754,我使用相同的数据类型,并且算法(如我所知)是相同的,那么误差从何而来!?错误可能来自许多地方,包括矩阵乘法运算的顺序。甚至编译代码的方式也可能影响结果。为x64编译可能会使用标准的双精度(64位),而x86可能会使用487协处理器指令,内部使用80位。这可能导致最低位数的差异。+ 1:使用SSE指令和X87 FPU指令是我在回答中没有考虑的一个重要点。事实上,我不需要太多的计算精度,但我不希望有任何错误。由于Matlab使用双IEEE 754,我使用相同的数据类型,并且算法(如我所知)是相同的,那么误差从何而来!?错误可能来自许多地方,包括矩阵乘法运算的顺序。甚至编译代码的方式也可能影响结果。为x64编译可能会使用标准的双精度(64位),而x86可能会使用487协处理器指令,内部使用80位。这可能导致最低位数的差异。+ 1:使用SSE指令和X87 FPU指令是我在回答中没有考虑的一个重要点。YEP,这是一个很小的错误,但我想知道它来自哪里!是的,这是一个很小的错误,但我想知道它是从哪里来的!!
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