m0_74749762 2023-11-14 20:10 采纳率: 0%
浏览 3

关于#c++#的问题:eigen库

我用eigen库写了下面的代码


#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{    
 
  MatrixXd b(3,6);
 
   b << 1,2,3,4,5,6,
           1,4,3,4,4,6,
        6,5,4,3, 2,1;
 
  std::cout << "单位阵:\n" << ((b*b.transpose()).inverse())*(b*b.transpose())<< std::endl;
}

输出如下

单位阵:
            1 -5.55112e-015 -8.88178e-016
 1.33227e-015             1             0
 2.22045e-016 -2.22045e-016             1

为什么输出的不是单位阵啊,但是我试了用2*5的矩阵输出的就是单位阵了,这是为啥,小菜鸡的实习编程急需解决。

  • 写回答

2条回答 默认 最新

  • 玥轩_521 2023-11-14 20:40
    关注

    这个问题的原因是浮点数的精度问题。在计算机中,浮点数是以二进制表示的,有些十进制小数无法精确地用二进制表示,因此会出现误差。在这个例子中,矩阵b的元素值是整数,所以误差较小。但是当矩阵元素为浮点数时,误差就会变得很大,导致输出的结果不再是单位阵。

    为了解决这个问题,你可以使用Eigen库中的isApprox()函数来检查两个矩阵是否近似相等。这样可以避免因为浮点数精度问题导致的误差。以下是修改后的代码:

    #include <iostream>
    #include <Eigen/Dense>
    using namespace Eigen;
    using namespace std;
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {    
     
      MatrixXd b(3,6);
     
       b << 1,2,3,4,5,6,
               1,4,3,4,4,6,
            6,5,4,3, 2,1;
     
      MatrixXd identity = MatrixXd::Identity(3, 6);
      std::cout << "单位阵:
    " << ((b*b.transpose()).inverse())*(b*b.transpose()) << std::endl;
      std::cout << "是否为单位阵:" << (identity.isApprox((b*b.transpose()).inverse()*(b*b.transpose()))) << std::endl;
    }
    

    这段代码会输出一个布尔值,表示计算结果是否接近单位阵。如果输出为true,则说明计算结果接近单位阵;如果输出为false,则说明计算结果不接近单位阵。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月14日

悬赏问题

  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估