美文网首页
Eigen库使用

Eigen库使用

作者: 菜鸟瞎编 | 来源:发表于2019-01-25 16:22 被阅读0次

    Eigen是一个只有头文件的轻量级C++矩阵运算库,便于在移动设备或嵌入式设备使用。
    官方文档:http://eigen.tuxfamily.org/dox/index.html
    构造一个矩阵:

    MatrixXf XX(sizeof(down_lips)/sizeof(down_lips[0]), 1); 
    

    用数组构造Matrix矩阵:

    float pointX[sizeof(down_lips)/sizeof(down_lips[0])] = {0};
    Map<Matrix<float, sizeof(down_lips)/sizeof(down_lips[0]), 1> > X(pointX);
    

    返回矩阵的最值

    float left = X.minCoeff();
    float right = X.maxCoeff();
    

    矩阵的每一个元素都减去一个标量(就是向量和标量的标量)

    X = X.array() - mx;
    

    矩阵对应元素相乘:

     XX = X.array().cwiseProduct(X.array());
    

    求矩阵均值:

    float dx2 = XX.mean();
    

    矩阵拼接

    MatrixXf M(X.rows(), X.cols()+Y.cols());        // 7 rows, 2 cols
    M << X, Y;
    

    换个方向拼接:

    MatrixXf M(X.rows()+Y.rows(), X.cols());        // 14 rows, 1 cols
    M << X, Y;
    

    计算两个矩阵的内积:

    t = M_PINV * RHS;
    

    取矩阵某一个元素的值:

    float ax = t.block(0,0,1,1).value();
    

    使用Eigen计算伪逆矩阵(https://www.cnblogs.com/wxl845235800/p/8892681.html):

    template<typename _Matrix_Type_>
    _Matrix_Type_ pseudoInverse(const _Matrix_Type_ &a, double epsilon =
    std::numeric_limits<double>::epsilon())
    {
        Eigen::JacobiSVD< _Matrix_Type_ > svd(a ,Eigen::ComputeThinU | Eigen::ComputeThinV);
        double tolerance = epsilon * std::max(a.cols(), a.rows()) *svd.singularValues().array().abs()(0);
        return svd.matrixV() *  (svd.singularValues().array().abs() > tolerance).select(svd.singularValues().array().inverse(), 0).matrix().asDiagonal() * svd.matrixU().adjoint();
    }
    
    

    Eigen矩阵基本运算

    相关文章

      网友评论

          本文标题:Eigen库使用

          本文链接:https://www.haomeiwen.com/subject/jtfvjqtx.html