一文梳理Ubuntu下Eigen矩阵运算库总结教程

Eigen是一个高效率的c++矩阵运算库,tensorflow等一系列开源框架都是用它来进行高效率的代数运算。如果你还没安装Eigen,那么亲参考Ubuntu下如何安装与使用cmake编译Eigen

0. 入门

1. 定义一个矩阵变量并赋值

注意Eigen中的矩阵要提前告诉程序各元素的数据类型(如果你不告诉它各元素是什么类型它默认是double类型)。比如你申明矩阵各个元素是int,然后你给矩阵某个元素赋值是1.3,它会变成1。

#include<iostream>
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    // 定义一个2×3的float矩阵
    // (注意每个元素都是float,有一个int就会报错)
    // Eigen中所有矩阵类型都市Matrix,
    // 它是一个模板类。模板的三个参数为<元素类型,行数,列数>
    Eigen::Matrix<int, 2, 3> matrix_23;
    // 给矩阵赋值它会自动变成2行3列的矩阵
    matrix_23 << 1.3,2,3,4,5,6;
    cout << matrix_23 <<endl;

    // 定义一个三维的向量(默认各元素是double类型)
    // 它等价于Eigen::Matrix<double,3,1> v1_3d;
    Eigen::Vector3d v1_3d;
    Eigen::Vector3d v2_3d;

    v1_3d << 1,2,3;
    v2_3d << 3,4,5;
    return 0;
}

注意Eigen预定义矩阵最大是50行50列。如果比这个还大或者不知道行数那就得用使用它的动态矩阵

Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;

2. 矩阵乘法

注意矩阵乘法两个矩阵各元素类型一定要一样不然会报错。比如有个矩阵各元素类型是int,另外一个是float那么会报错。

#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    Eigen::Matrix<double, 2, 3> matrix_23;
    // 给矩阵赋值它会自动变成2行3列的矩阵
    matrix_23 << 1.3,2,3,4,5,6;

    // 定义一个三维的向量(默认各元素是double类型)
    // 它等价于Eigen::Matrix<double,3,1> v1_3d;
    Eigen::Vector3d v1_3d;
    v1_3d << 1,2,3;
    // 这个就是矩阵乘法
    cout << matrix_23*v1_3d << endl;
    return 0;
}

3. 根据下标访问矩阵的元素

注意下标是从0开始。

#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    Eigen::Matrix<double, 2, 3> matrix_23;
    // 给矩阵赋值它会自动变成2行3列的矩阵
    matrix_23 << 1.3,2,3,4,5,6;
    cout << matrix_23(0,0) << endl;
    return 0;
}

4. 矩阵转置,各元素求和,对角线元素之和(迹),逆,行列式

#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    Eigen::Matrix<double, 2, 2> matrix_22;
    // 给矩阵赋值它会自动变成2行3列的矩阵
    matrix_23 << 1.3,2,3,4;
    cout << "转置\n" <<matrix_22.transpose() << endl;
    cout << "各元素之和\n" <<matrix_22.sum() << endl;
    cout << "对角线元素之和(迹)\n" <<matrix_22.trace() << endl;
    cout << "逆矩阵\n" <<matrix_22.inverse() << endl;
    cout << "行列式\n" <<matrix_22.determinant() << endl;

    return 0;
}

5. 随机生成特定形状的矩阵(各元素是随机数)

#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    Eigen::Matrix<double, 2, 2> matrix_22;
    matrix_22 = Eigen::MatrixXd::Random(2,2);
    cout << matrix_22 << endl;
    return 0;
}

6. QR分解

计算量有点大会卡一下。

#include<iostream>
using namespace std;
#include <Eigen/Core>
// 求特征值,逆矩阵要用
#include<Eigen/Dense>
int main()
{
    // 假设我们要解这个方程 Ax=b
    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A,x,b;
    A = Eigen::MatrixXd::Random(60,10);
    b = Eigen::MatrixXd::Random(60,1);
    x = A.colPivHouseholderQr().solve(b);
    cout<< x<< endl;
    return 0;
}

posted @ 2019-06-13 15:07  varyshare|李韬  阅读(672)  评论(0编辑  收藏  举报