Eigen基础教程

Matrix Class

  1. 定义矩阵:使用Matrix来定义矩阵。实际使用时,如果矩阵是4x4或更小的,则可以直接使用特定的方阵,如Matrix4f (typedef Matrix Matrix4f),否则使用MatrixXd。
  2. 向量: Eigen中向量也是矩阵,包括行向量Vector (typedef Matrix' Vector3f)和列向量RowVector ('typedef Matrix RowVector3f)。
  3. Dynamic Size: 即动态尺寸,如typedef Matrix MatrixXd,同样有VectorXd
  4. 构造函数:
    i. 默认构造函数:MatrixXd a;,这样的尺寸是0x0。
    ii. 带尺寸的(只适用于动态尺寸): MatrixXd a(30, 15);
    iii. 用数值初始化(只适用于定长的向量): Vector3d(4.0, 5.0, 6.0);
  5. 索引: 矩阵用m(0,1), 向量用v(1)v[1]
  6. 初始化: m << 1, 2, 3, 4;
  7. Resize: 动态尺寸的可以resize(),但是由于是开辟一块新内存,所以原来的数都变了;如果不想变,可以用conservativeResize()。同时可以用rows(), cols(), size()方法来获取尺寸信息。
  8. 赋值:即用矩阵给矩阵赋值a=b,这样是深拷贝,具体实现是先将a给resize,然后再拷贝。
  9. fixed size v.s. dynamic size: 16个元素(4x4)以下用fixed size。当尺寸大于32时,两种size的速度差别不明显。

矩阵、向量运算

  1. 对Matrix和Vector,只能进行线性代数运算,如m1 * m2,不支持vector + scalar等运算。
  2. 加减运算包括 a+b, a-b, a+=b, a-=b, -a,只支持a,b同类型。Eigen不支持隐式类型转换
  3. 标量乘除: ms, m/s, sm, m/=s。
  4. 转置transpose(),共轭conjugate()(只支持复数类型,如MatrixXcf),共轭转置adjoint()。对于转置操作,即b=a.transpose(),转置与写b同时进行,即若有a=a.transpose(),则得到的a不变,可以用transposeInPlace()方法。
  5. 矩阵相乘:ab, a=b。
  6. 向量点积v1.dot(v2),叉积v1.cross(v2)(只适用于Vector3t)。
  7. 各种Reduction运算:sum(), prod(), mean(), minCoeff(), maxCoeff(), trace()

Array Class与Coefficient-Wise运算

  1. Array用于general的运算,而Matrix用于线性代数运算。
  2. 定义与matrix一样:Array,但是各种typedef不一样,MatrixNt是方阵,而ArrayNt是一维的,ArrayNNt是二维的,N=1,2,3,4,X。
  3. arr(0,1),初始化arr<<1,2,3,4;
  4. Array可以与Scalar相加减,Array之间的乘法也是按系数来的,因此两个Array的尺寸必须相同。
  5. abs(), sqrt(), min()都是按系数的。
  6. Array与Matrix转换: Matrix不可以跟Array直接运算,需要进行转换,如mat.array()arr.matrix()。可以用array直接给matrix赋值。如果想用matrix进行按系数的乘法,可以用m1.cwiseProduct(m2)

Block操作

  1. block()方法用法:
  • 动态尺寸块:m.block(i,j,p,q)
  • fixed-size block: m.block(i,j),更快,但是p, q必须编译的时候知道。
    Eigen的速度取决于在compile time给Eigen多少信息
  1. m.row(i)m.col(j).block()的特例。
  2. Corner related: topLeftCorner(p, q), bottomRightCorner, topRightCorner, bottomLeftCorner; topRows(q), bottomRows, leftCols, rightCols。其中p, q都可以提前,如topLeftCorner()。
  3. Vector的corner related: head(n), tail(n), segment(i,n), n可提前。

Advanced 初始化

  1. comma initializer: m<<1,2,3,4。尺寸必须一致。可以用vectors赋值,如v << v1, v2,也可以用block赋值,也可以对block赋值。
  2. 特殊矩阵与ArrayZero()有三个变种:无参数(仅用于fixed-size),有一个参数(用于一维),有两个参数(用于二维)。同样还有Constant(scalar), Random(), Identity()(仅用于矩阵), linSpaced(size, low, high)(等差vector)。返回的expression对象可以作为临时对象。也有成员方法setZero(), setIdentity(), setLinSpaced()

你可能感兴趣的:(库教程)