【22】Eigen的常见用法总结

1 向量和矩阵的运算主要包含

(1)矩阵和矩阵的运算

(2)向量和向量的运算

(3)矩阵和向量的运算

(4)矩阵和向量的标量运算

(5)矩阵的自身运算、分解、逆矩阵、伴随矩阵

2 易犯错误点

(1)向量的叉乘只能针对三维向量,向量的点乘对于向量长度没有限制;

(2)向量默认为行向量;

(3)矩阵和矩阵的除法,需要转换为数组运算

(4)向量和向量的乘法和除法则需要转换为数组运算;

(5)数组运算是支持所有数学运算的,数组和矩阵可以互相转化。

3  使用说明

#include<iostream>
#include<vector>
#include<array>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

void main()
{
    //向量和向量运算
    Eigen::Vector3f vec1(1, 2, 3);
    Eigen::Vector3f vec2(1, 2, 3);        
    std::cout << vec1+vec2 << std::endl;//246
    std::cout << vec1-vec2 << std::endl;//000
    std::cout << vec1.array() * vec2.array() << std::endl;//149
    std::cout << vec1.array() / vec2.array() << std::endl;//111
    //点应向量的元素相乘在乘,对相加,长度任意
    std::cout << vec1.dot(vec2) << std::endl;//14
    //向量的叉乘,新的向量垂直于原来的两个向量,只能是长度为3的向量
    std::cout << vec1.cross(vec2) << std::endl;//000

    //矩阵和矩阵的运算
    Eigen::MatrixXd m1(2, 2);
    m1 << 1, 2, 3, 4;
    Eigen::MatrixXd m2(2, 2);
    m2 << 1, 2, 3, 4;
    std::cout << m1 + m2 << std::endl;
    std::cout << m1 - m2 << std::endl;
    std::cout << m1 * m2 << std::endl;
    std::cout << m1 * 0.1 << std::endl;
    //矩阵无法直接进行除法,需要转换为数组后在进行除法,本质就是矩阵每一个元素相除
    std::cout << m1.array() / m2.array() << std::endl;

    //矩阵和向量的运算
    Eigen::Vector3f vec11(1,2,3);
    Eigen::MatrixXf m4(3, 3);
    m4 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
    //矩阵和向量的运算必须保证维度一样,简言之就是从矩阵中拿出一个向量再进行运算
    std::cout << m4.col(1) + vec11 << std::endl;
    std::cout << m4.col(1) - vec11 << std::endl;
    std::cout << m4.col(1).array() * vec11.array() << std::endl;
    std::cout << m4.col(1).array() / vec11.array() << std::endl;
    //向量的长度任意
    std::cout << m4.col(1).dot( vec11)<< std::endl;
    Eigen::Vector3f block = m4.row(1);
    //向量的长度只能为3
   std::cout << block.cross(vec11) << std::endl;

    矩阵的计算,转置、共轭、伴随
    Eigen::MatrixXf m5(2, 2);
    m5 << 1, 2, 3, 4;
    cout << "Here is the matrix a\n" << m5 << endl;
    cout << "Here is the matrix a^T\n" << m5.transpose() << endl;
    cout << "Here is the conjugate of a\n" << m5.conjugate() << endl;
    cout << "Here is the matrix a^*\n" << m5.adjoint() << endl;

    QR分解
    Matrix3d A;
    A << 1, 1, 1, 2, -1, -1, 2, -4, 5;
    HouseholderQR<Matrix3d> qr;
    qr.compute(A);
    MatrixXd R = qr.matrixQR().triangularView<Upper>();
    MatrixXd Q = qr.householderQ();
    std::cout << "QR2(): HouseholderQR---------------------------------------------" << std::endl;
    std::cout << "A " << std::endl << A << std::endl << std::endl;
    std::cout << "qr.matrixQR()" << std::endl << qr.matrixQR() << std::endl << std::endl;
    std::cout << "R" << std::endl << R << std::endl << std::endl;
    std::cout << "Q " << std::endl << Q << std::endl << std::endl;
    std::cout << "Q*R" << std::endl << Q * R << std::endl << std::endl;
}

参考博客:

Eigen中的基本函数_我是小沙的博客-CSDN博客_eigen函数Eigen: C++开源矩阵计算工具——Eigen的简单用法_Augusdi的博客-CSDN博客_eigen矩阵Eigen中的基本函数_我是小沙的博客-CSDN博客_eigen函数

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值