特征在矩阵加法中丢失负号

时间:2017-06-14 17:22:34

标签: c++ matlab eigen

我正在尝试使用Eigen库添加一个矩阵,我的结果在数值上还可以,但它缺少负号。添加后的结果更正是失去负号的最终添加。所有矩阵都声明为double。

我在这两种情况下都有这个代码:

for(int i=0;i<9;i++){
 mata<<MatrixXd::Zero(4,4);
  for(int j=0;i<4;j++){
   mata += matb.transpose()*(matc*matb)*scalar;
  }
 cout<<mata<<endl;
}

我也尝试过:

for(int i=0;i<9;i++){
 mata<<MatrixXd::Zero(4,4);
  for(int j=0;i<4;j++){
   MatrixXd aux=matb.transpose();
   MatrixXd aux2=(matc*matb)*scalar
   mata += aux*aux2;
  }
 cout<<mata<<endl;
}

Matlab结果:

    1.92186   -0.960928   -0.960928 -5.55112e-17
  -0.960928     1.92186 -5.55112e-17   -0.960928
  -0.960928 -5.55112e-17     1.92186   -0.960928
-5.55112e-17   -0.960928   -0.960928     1.92186

特征结果:

    1.92186   -0.960928   -0.960928 5.55112e-17
  -0.960928     1.92186 5.55112e-17   -0.960928
  -0.960928 5.55112e-17     1.92186   -0.960928
5.55112e-17   -0.960928   -0.960928     1.92186

1 个答案:

答案 0 :(得分:7)

这是浮点计算精度的结果。两者之间的顺序略有不同(第一个先完成所有矩阵乘法,然后按scale进行缩放,而第二个矩阵乘以之前的第二个缩放)导致浮点结果的最低有效位或两个在最后一个矩阵乘法的各种加法和减法期间不同。

您实际看到的数字(5.55112e-17)实际上是0,结果完全相同。