EIgen:Matricx和vector类的定义和使用

在Eigen中,所有矩阵和向量均为Matrix模板类的对象,向量是矩阵的行(或列)为1是的特殊情况。

1、矩阵的三参数模板

Matrix类有六个模板参数,其中三个有默认值,因此只要学习三个参数就足够了。强制性的三参数模板的原型为:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

三个参数分别表示:标量的类型,编译时的行,编译时的列。

typedef定义了很多模板,例如:Matrix4f 表示 4×4 的floats 矩阵:

typedef Matrix<float, 4, 4> Matrix4f;

2、向量(Vectors)

向量是矩阵的特殊情况,也是用矩阵定义的。定义如下:

typedef Matrix<float, 3, 1> Vector3f;
typedef Matrix<int, 1, 2> RowVector2i;

3、特殊动态值(special value Dynamic)

Eigen的矩阵不仅能够在编译是确定大小(fixed size),也可以在运行时确定大小,就是所说的动态矩阵(dynamic size)。动态矩阵定义如下:

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<int, Dynamic, 1> VectorXi;

也可使用‘行’固定‘列’动态的矩阵:

Matrix<float, 3, Dynamic>

4、构造函数(Constructors)

可以使用默认的构造函数,不执行动态分配内存,也没有初始化矩阵参数:

Matrix3f a;
MatrixXf b;
  • a 是3-by-3矩阵,包含未初始化的 float[9] 数组
  • b是动态矩阵,当前大小为 0-by-0, 没有为数组的系数分配内存

矩阵的第一个参数表示“行”,数组只有一个参数。根据跟定的大小分配内存,但不初始化。

MatrixXf a(10,15);
VectorXf b(30);
  • a 是10-by-15阵,分配了内存,没有初始化
  • b是动态矩阵,当前大小为 30, 分配了内存,没有初始化

对于给定的矩阵,传递的参数无效,如:

Matrix3f a(3,3);

对于维数最大为4的向量,可以直接初始化:

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

5、系数访问

系数都是从0开始:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << "Here is the matrix m:\n" << m << std::endl;
  VectorXd v(2);
  v(0) = 4;
  v(1) = v(0) - 1;
  std::cout << "Here is the vector v:\n" << v << std::endl;
}

矩阵默认按列存储。
operator[] 在 vectors 中重载。matrix[i,j]和matrix[j]含义相同。

6、逗号分隔的初始化

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;

7、Resizing

可以用rows(), cols() and size() 改变现有矩阵的大小。这些类方法返回行、列、系数的数值。也可以用resize()来改变动态矩阵的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值