Eigen 快速入门

矩阵定义

typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;
Matrix<double, 10, 5>   		//10行5列,数据类型为double
Matrix<double, 10, Dynamic>     //列数是动态的
Matrix<double, Dynamic, Dynamic> //行列都是动态的

简写方式:

原表达式简写
Matrix<float, Dynamic, Dynamic>MatrixXf
Matrix<double, Dynamic, 1>VectorXd
Matrix<int, 1, Dynamic>RowVectorXi
Matrix<float, 3, 3>Matrix3f
Matrix<float, 4, 1>vector4f
#include <iostream>
#include "eigen_3_3_7/Eigen/Eigen"

int main()
{
    //typedef Matrix<float, Dynamic, Dynamic> MatrixXf;
    Eigen::MatrixXf matrix1(3,4); 		 //定义了矩阵的大小,但是没有初始化。
    //typedef Matrix<float, 3, 1> Vector3f;
    Eigen::Vector3f vector1;

    matrix1 = Eigen::MatrixXf::Zero(3,4); //对矩阵进行初始化,全0。
    vector1 = Eigen::Vector3f::Ones();	  //全1	

    std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl;
    std::cout << "------ vector1 ------" << std::endl << vector1 << std::endl;
}

对固定大小(行,列已知)矩阵进行初始化

    Eigen::MatrixXf matrix1(3,4);  //已知矩阵大小
    Eigen::Vector3f vector1;

    matrix1 << 1, 2,  3,  4, 
               5, 6,  7,  8,
               9, 10, 11, 12;
    vector1 << 1, 2, 3;

单位矩阵

Matrix3d rotation_matrix = Matrix3d::Identity();

Matrix3d:Eigen库中typedef的数据类型,即“3*3矩阵(d表示矩阵内部数据类型为double类型)”

rotation_matrix:该3*3矩阵的变量名

Matrix3d::Identity():在定义该矩阵变量时,创建一个同尺寸同数据类型的单位阵,对其初始化。

Eigen的block操作(块操作)

在做GAMES101作业1的时候,看到有用到block操作

matrix.block(i,j,p,q)
p,q表示block的大小。
i,j表示从矩阵中的第几个元素开始向右向下开始算起
例如:

Eigen::MatrixXf m(3,4);
m<<1,   2,   3,   4,
   5,   6,   7,   8,
   9,  10,   11,  12,
   
m.block(0,0,1,1)=1

m.block(0,0,2,2)=
1   2
5   6

将 Eigen Vector4 类型转换为 Vector3

.head() 成员函数返回 vector 的前 n 个元素。如果 n 是一个编译时常量,那么您可以使用模板化变体(如下面的代码示例),Eigen 库将自动展开循环。

Eigen::Vector4f vec4;
// initialize vec4
Eigen::Vector3f vec3 = vec4.head<3>();

矩阵点乘、叉乘、转置、求逆、求和、行列式、迹、数乘

展示Eigen::Matrix矩阵运算,点乘、叉乘、转置、求逆、求和、行列式、迹、数乘等

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

int main(int argc, char** argv){
    // Eigen::Matrix为模板类,可自由定义不同维度的矩阵,
    // 此处仅展示较为常用的几种数据类型,其它定制化需求类型的使用,可以此类推;

    // 自定义创建4x4的矩阵,模板参数依次为:数据类型,行数,列数;
    Eigen::Matrix<float, 4, 4> matrix_4f;
    // 使用常数值进行初始化填充;
    matrix_4f = Eigen::Matrix<float,4,4>::Random();
    std::cout<<"matrix_4f random init:\n"<<matrix_4f<<std::endl<<std::endl;
    std::cout << "transpose:\n" << matrix_4f.transpose()<<std::endl<<std::endl;     // 转置
    std::cout << "sum: " << matrix_4f.sum()<<std::endl;                             // 各元素和
    std::cout << "det: " << matrix_4f.determinant()<<std::endl;                     // 行列式
    std::cout << "trace: " << matrix_4f.trace()<<std::endl<<std::endl;              // 迹
    std::cout << "times 10:\n" << 10 * matrix_4f<<std::endl<<std::endl;             // 数乘
    std::cout << "inverse:\n" << matrix_4f.inverse()<<std::endl<<std::endl;         // 逆
    
    
    // 3x1 列向量
    Eigen::Vector3f vector_3f(1.0f, 2.0f, 3.0f);
    std::cout<<"vector_3f:\n"<<vector_3f<<std::endl;

    Eigen::Vector3f vector_3f_tmp = Eigen::Vector3f::Constant(4.0f);
    std::cout<<"vector_3f_tmp:\n"<<vector_3f_tmp<<std::endl<<std::endl;

    // 点乘
    std::cout<<"vector_3f.dot(vector_3f_tmp): "<<(vector_3f.dot(vector_3f_tmp))<<std::endl<<std::endl;
    // 叉乘
    std::cout<<"vector_3f.cross(vector_3f_tmp):\n"<<(vector_3f.cross(vector_3f_tmp))<<std::endl<<std::endl;
    // 与矩阵变换
    Eigen::Matrix3f rotation = Eigen::Matrix3f::Random();
    std::cout<<"matrix transform:\n"<<(rotation*vector_3f)<<std::endl<<std::endl;
    

    return 0;
}
matrix_4f random init:
 -0.997497   0.170019    0.64568   0.421003
  0.127171 -0.0402539    0.49321  0.0270699
 -0.613392  -0.299417  -0.651784   -0.39201
  0.617481   0.791925   0.717887  -0.970031

transpose:
 -0.997497   0.127171  -0.613392   0.617481
  0.170019 -0.0402539  -0.299417   0.791925
   0.64568    0.49321  -0.651784   0.717887
  0.421003  0.0270699   -0.39201  -0.970031

sum: 0.0470595
det: 0.487613
trace: -2.65957

times 10:
 -9.97497   1.70019    6.4568   4.21003
  1.27171 -0.402539    4.9321  0.270699
 -6.13391  -2.99417  -6.51784   -3.9201
  6.17481   7.91925   7.17887  -9.70031

inverse:
-0.666487   0.21703  -0.55909 -0.057265
 0.610491  -3.01019  -1.01982  0.593088
 0.209112   1.78086  0.121229 0.0914626
 0.228898  -1.00139  -1.09875 -0.515468

vector_3f:
1
2
3
vector_3f_tmp:
4
4
4

vector_3f.dot(vector_3f_tmp): 24

vector_3f.cross(vector_3f_tmp):
-4
 8
-4

matrix transform:
 -4.4391
-1.28898
-3.86914
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值