Eigen库基础操作
程序员文章站
2022-06-03 16:11:20
...
声明、初始化
Eigen提供了很多内置类型,但是底层均为Eigen::Matrix。例如Vector3d是<double,3,1> Matrix3d是<double,3,3>
Eigen::Matrix<float, 2, 3> matrix_23; //申明一个2x3的float矩阵
Eigen::Vector3d v_3d; //实质上是Matrix<double, 3, 1>
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;
Eigen::MatrixXd matrix_x;
初始化使用matrix33<<1,2,3,4,5,6; 即可进行赋值
基本运算
matrix_33.transpose() //转置
matrix_33.sum() //各元素和
matrix_33.trace() //迹
10 * matrix_33 //数乘
matrix_33.inverse(); //逆
matrix_33.determinant(); //行列式
测试程序
#include <iostream>
#include <ctime>
#include <Eigen/Dense>
#include <Eigen/Core>
#define MATRIX_SIZE 50
using namespace std;
int main() {
//声明
Eigen::Matrix<float, 2, 3> matrix_23; //申明一个2x3的float矩阵
Eigen::Vector3d v_3d; //实质上是Matrix<double, 3, 1>
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;
Eigen::MatrixXd matrix_x;
matrix_23 << 1, 2, 3, 4, 5, 6;
cout << matrix_23 << endl;
for (int i = 0; i < 1; i++)
for (int j = 0; j < 2; j++)
cout << matrix_23(i, j) << endl;
v_3d << 3, 2, 1;
//注意此处的矩阵与向量为两种不同的类型不能混合使用
//应显示转换后再与矩阵相乘
Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
//注意不能搞错矩阵维度
//Eigen::Matrix<double, 2, 3> result_wrong = matrix_23.cast<double>() * v_3d;
cout << result << endl;
//矩阵运算
matrix_33 = Eigen::Matrix3d::Random();
cout << matrix_33 << endl << endl;
//常见运算
cout << matrix_33.transpose() << endl; //转置
cout << matrix_33.sum() << endl; //各元素和
cout << matrix_33.trace() << endl; //迹
cout << 10 * matrix_33 << endl; //数乘
cout << matrix_33.inverse(); //逆
cout << matrix_33.determinant(); //行列式
//特征值,需要先将矩阵对角化,是对成举证可以保证对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
cout << "Eigen values = " << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = " << eigen_solver.eigenvectors() << endl;
//解方程 求解matrix_NN * x =v_Nd这个方程
Eigen::Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN;
matrix_NN = Eigen::MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);
Eigen::Matrix<double, MATRIX_SIZE, 1> v_Nd;
v_Nd = Eigen::MatrixXd::Random(MATRIX_SIZE, 1);
clock_t time_stt = clock(); //计时
//直接求逆
Eigen::Matrix<double, MATRIX_SIZE, 1> x = matrix_NN.inverse() * v_Nd;
cout << "用时" << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << x << endl;
//利用矩阵分解求解。例如QR分解,有时速度会快一些
time_stt = clock();
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout << "用时" << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << x << endl;
return 0;
}
上一篇: armadillo库小案例
下一篇: Eigen库学习(1)