Eigen 基本类型的简单使用

官方文档

初始化

    Matrix<float,2,3> mat_23;
    //数据类型float,2行,3列
    Vector3d v_3d;Matrix<float, 3, 1> vd_3d;
 	 // v_3d,vd_3d是一样的
 	
  	Matrix3d matrix_33 = Matrix3d::Zero(); //初始化为零
  	// Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>
Matrix<float,2,3> mat_23;
matrix_23 << 1, 2, 3, 4, 5, 6;cout<<mat_23<<endl;
//长度必须一致,多少都会报错
Matrix3d matrix_33 = Matrix3d::Zero(); //初始化为零
matrix_33 = Matrix3d::Random();
MatrixXd matrix_x(matrix_33);//通过其他矩阵赋值
//通过

输出:

1 2 3
4 5 6

访问元素

cout<<mat_23(1,1)<<endl;
//(行,列)

乘法

数组乘矩阵

   mat_23<<1,2,3,4,5,6;
   v_3d<<3,2,1;
   vd_3d<<4,5,6;
    Matrix<float, 2, 1> result2 = mat_23 * vd_3d;
	  Matrix<double, 2, 1> result=mat_23.cast<int>()*v_3d;
//不同类型的矩阵,不能直接相乘,需要类型转换
cout<<result<<endl;
cout<<result2<<endl;

结果

1 2 3
4 5 6
1 2 3
4 5 6

其他

  matrix_33 = Matrix3d::Random();      							// 随机数矩阵
  cout << "random matrix: \n" << matrix_33 << endl;
  cout << "transpose: \n" << matrix_33.transpose() << endl;     // 转置
  cout << "sum: " << matrix_33.sum() << endl;            		// 矩阵所有元素和
  cout << "trace: " << matrix_33.trace() << endl;          		// 迹:对角元素和
  cout << "times 10: \n" << 10 * matrix_33 << endl;             // 数乘
  cout << "inverse: \n" << matrix_33.inverse() << endl;        	// 逆
  cout << "det: " << matrix_33.determinant() << endl;			// 转为行列式
  cout<<""<<matrix_33.prod()<<endl;//平方和
  cout<<""<<matrix_33.minCoeff()<<endl;//元素最小值
  cout<<""<<matrix_33.maxCoeff()<<endl;//元素最大值
    cout<<""<<matrix_33.norm()<<endl;//矩阵模值

特征值与特征向量

SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
 //构造一个实对称矩阵,SelfAdjointEigenSolver模板类,专门计算特征值和特征向量
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;//特征值
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;//特征向量

解方程

直接求逆:时间长

#define Max_size 50
  Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN
      = MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);
  matrix_NN = matrix_NN * matrix_NN.transpose();  // 保证半正定
  Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE, 1);

  Matrix<double, Max_size, 1> x = matrix_NN.inverse() * v_Nd;
  cout << "time of normal inverse is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl;

输出

time of normal inverse is 137.61ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734

使用QR分解

  time_stt = clock();
  x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
  cout << "time of Qr decomposition is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl

输出

time of Qr decomposition is 6.3ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734

cholesky分解(仅限正定矩阵)

  time_stt = clock();
  x = matrix_NN.ldlt().solve(v_Nd);
  cout << "time of ldlt decomposition is "<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
  cout << "x = " << x.transpose() << endl;
time of ldlt decomposition is 1.673ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 是一个强大的跨平台应用程序开发框架,而 Eigen 是一个高性能的线性代数库。在 Qt 开发中,你可以使用 Eigen 来增强图形处理、数学运算和数据分析等功能,特别是在处理矩阵和向量计算时。 将 Eigen 集成到 Qt 应用中,通常涉及以下几个步骤: 1. **安装 Eigen**:首先确保你的系统已经安装了 Eigen,可以通过包管理器或直接从 Eigen 官网下载源代码编译。 2. **包含头文件**:在你的 Qt 项目中,添加 Eigen 的头文件 `<Eigen/Dense>` 或 `<Eigen/Sparse>`,取决于你需要的线性代数类型。 3. **使用 Eigen 类型**:创建 Eigen 的矩阵(`MatrixXd`、`VectorXd`)或向量(`Vector3d`)实例,它们提供了丰富的数学操作方法,如矩阵乘法、转置、求逆等。 4. **连接信号槽**:如果你需要在 Qt 控件的事件响应中使用 Eigen,可能需要将 Eigen 的计算结果与 Qt 对象绑定起来。 5. **模板和智能指针**:Eigen 提供了模板类,可以方便地与 Qt 的智能指针(如 `QSharedPointer` 或 `std::unique_ptr`)一起使用,以避免内存泄漏。 6. **性能优化**:尽管 Eigen 已经是高效库,但在大规模计算时,仍需考虑内存管理和并行计算,Qt 的多线程支持可以在此时发挥作用。 相关问题: 1. Eigen 在 Qt 中主要用于哪些数学计算? 2. 如何在 Qt 的信号槽连接中使用 Eigen 的结果? 3. Eigen 的模板类如何与 Qt 智能指针配合使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值