我试图使用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;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
特征结果:
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
Run Code Online (Sandbox Code Playgroud)
这是浮点计算精度的结果.两者之间的顺序略有不同(第一次完成所有矩阵乘法,然后按比例缩放scale,而在最后一个矩阵乘法之前第二次缩放)导致浮点结果的最低有效位或两个在各种加法期间不同和最后一个矩阵的减法相乘.
你看到的数字(5.55112e-17)在这里实际上是有效的0,结果是相同的.