Eigen入门系列 —— 基于Eigen(最小二乘法)求解方程(QR、cholesky)

Eigen入门系列 —— 基于Eigen(最小二乘法)求解方程(QR、cholesky)


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析场景数据分析基础算法模块相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。

在这里插入图片描述


程序说明

展示基于Eigen求解方程(最小二乘法),并进行多种方法时耗对比;

输出结果

在这里插入图片描述

代码示例

/*
 * @File: solve_equation.cpp
 * @Brief: eigen course
 * @Description: 展示基于Eigen求解方程(最小二乘法)
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <Eigen/Dense>



int main(int argc, char** argv){
    
    
    
    // 假设求解 matrix_NN * x = v_Nd 这个方程
    // 直接求逆是最直接的,但是求逆运算量大

    // 参数维度
    const int kParamNum = 25;

    // 此处创建与参数维度数量等同的方程及对应的值
    Eigen::Matrix<double, kParamNum, kParamNum> matrix_NN = Eigen::MatrixXd::Random(kParamNum, kParamNum);
    matrix_NN = matrix_NN * matrix_NN.transpose();  // 保证半正定
    Eigen::Matrix<double, kParamNum, 1> v_Nd = Eigen::MatrixXd::Random(kParamNum, 1);

    clock_t time_stt = clock(); // 计时
    // 直接求逆
    Eigen::Matrix<double, kParamNum, 1> x = matrix_NN.inverse() * v_Nd;
    std::cout << "time of normal inverse is "
        << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << std::endl;
    std::cout << "x =\n" << x << std::endl<<std::endl;

    // 通常用矩阵分解来求,例如QR分解,速度会快很多
    time_stt = clock();
    x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
    std::cout << "time of Qr decomposition is "
        << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << std::endl;
    std::cout << "x = \n" << x << std::endl<<std::endl;

    // 对于正定矩阵,还可以用cholesky分解来解方程
    time_stt = clock();
    x = matrix_NN.ldlt().solve(v_Nd);
    std::cout << "time of ldlt decomposition is "
        << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << std::endl;
    std::cout << "x = \n" << x << std::endl<<std::endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/memorynode/article/details/124721320