矩阵定义
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 库将自动展开循环。文章来源:https://www.toymoban.com/news/detail-569447.html
Eigen::Vector4f vec4;
// initialize vec4
Eigen::Vector3f vec3 = vec4.head<3>();
矩阵点乘、叉乘、转置、求逆、求和、行列式、迹、数乘
展示Eigen::Matrix矩阵运算,点乘、叉乘、转置、求逆、求和、行列式、迹、数乘等文章来源地址https://www.toymoban.com/news/detail-569447.html
#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
到了这里,关于Eigen 快速入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!