- example 1
#include<iostream>
#include<Eigen/Dense>
//matrix
int main1()
{
Eigen::MatrixXd m(2, 2);
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = 3;
m(1, 1) = 4;
std::cout << "m= " << std::endl << m << std::endl;
return 0;
}
-
example2:任意矩阵VS固定矩阵
使用固定矩阵由两大好处
1.因为知道大小,所以编译速度更快
2.在编译的时候有更严格的参数检查
推荐对4*4及更小的矩阵使用固定大小的矩阵和向量
int main2_1()
{
Eigen::MatrixXd m = Eigen::MatrixXd::Random(3, 3);//random values between -1 and 1
m = (m + Eigen::MatrixXd::Constant(3, 3, 1.2) )* 50;
std::cout << "m= " << std::endl << m << std::endl;
Eigen::VectorXd v(3);
v << 1, 2, 3;//comma-initializer,explained in Advanced initialization
std::cout << "m*v " << std::endl << m*v << std::endl;
return 0;
}
int main2_2()
{
Eigen::Matrix3d m = Eigen::Matrix3d::Random();
m = (m + Eigen::Matrix3d::Constant(1.2) )* 50;
std::cout << "m= " << std::endl << m << std::endl;
Eigen::Vector3d v(1,2,3);
std::cout << "m*v " << std::endl << m*v << std::endl;
return 0;
}
-
Matrix 类
在eigen中,所有的矩阵和向量都是Matrix模板类的对象
Matrix一个有6个模板参数,前三个是强制性的模板参数,后三个参数有默认值
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
Scalar矩阵中元素的类型,可支持基本类型和自定义类型
RowsAtCompileTime、ColsAtCompileTime为编译时要知道的行或列的数值
Eigen实现了方便的类型定义以覆盖常见的类,typedef Matrix<float, 4, 4> Matrix4f; -
向量是行或列为1的矩阵,列为1的矩阵更常用,列向量常用名column-vectors,just vectors
typedef Matrix<float, 3, 1> Vector3f
typedef Matrix<int, 1, 2> RowVector2i; -
特殊的动态值
Eigen支持在编译时大小未知的矩阵,该类型的值在Eigen中称为dynamic size,相对编译时大小已知的fixed size而言,
typedef Matrix<double, Dynamic, Dynamic> MatrixXd; -
构造器(构造函数)
通常使用默认的构造函数,不进行动态内存的分配也不初始化矩阵元素,eg.Matrix3f a;
仅分配空间,不进行初始化的构造函数,eg.MatrixXf a(10,15);
为了对固定大小和动态大小的矩阵提供统一的API,固定大小的矩阵也可以使用该API,只是大小数值无效
对大小小于等于4的固定向量提供了可初始化参数的构造函数,Vector4d c(5.0, 6.0, 7.0, 8.0); -
元素访问
对于矩阵,先传入行索引,再传入列索引;y也可采用单索引,单索引依赖在内存中的存储顺序,默认列优先存储,但是也可以改为行优先
对于向量,只传入索引
仅向量可用[]取值操作,且每次最多取一个值。
因为在C++编译中,matrix[i,j]会被编译为matrix[j] -
逗号初始化
矩阵和向量都可以采用逗号初始化方法 -
Resizing
rows(), cols() and size()可分别获得矩阵的行、列和元素数目,
resize()可动态对矩阵形状进行转化