Eigen中的块操作
Eigen块操作
在SLAM问题中的对于Hessian矩阵以及其他一些雅克比矩阵进行操作的时候,经常会使用到eigen库中矩阵的块操作,在此做一个简单的总结
Block
Eigen中最通用的就是Block,可以使用block来定位并取出各种位置和内容
对于一个\((p,q)\) 大小,从\((i,j)\)坐标开始的矩阵块,可以有以下两种表示的方式
1 | matrix.block(i,j,p,q); |
其中较为常用的就是第一种方式
可以使用block表达式作为右值,同时也可以用同样大小的block来作为左值进行赋值使用.
Row & Col
行和列是特殊的据真快,EIgen提供了特殊的用法
对于矩阵中的第i行
1 | matrix.row(i); |
对于矩阵中的第j列
1 | matrix.col(j); |
边角定位操作
对于边角的定位,也是matrix中至关重要的一个环节,也就是可以通过这种方式来修改矩阵的某一个部分
这个部分很好用
Corner
左上角的 p x q 大小的矩阵块
块操作 | Version constructing a dynamic-size block expression | Version constructing a fixed-size block expression |
---|---|---|
左上角的 p x q 大小的矩阵块 * | matrix.topLeftCorner(p,q); | matrix.topLeftCorner<p,q>(); |
左下角的 p x q 大小的矩阵块 * | matrix.bottomLeftCorner(p,q); | matrix.bottomLeftCorner<p,q>(); |
右上角的 p x q 大小的矩阵块 * | matrix.topRightCorner(p,q); | matrix.topRightCorner<p,q>(); |
右下角的 p x q 大小的矩阵块 * | matrix.bottomRightCorner(p,q); | matrix.bottomRightCorner<p,q>(); |
Line
块操作 | Version constructing a dynamic-size block expression | Version constructing a fixed-size block expression |
---|---|---|
包含前q行 * | matrix.topRows(q); | matrix.topRows(); |
包含后q行 * | matrix.bottomRows(q); | matrix.bottomRows(); |
包含前q列 * | matrix.leftCols(p); | matrix.leftCols |
包含后q列 * | matrix.rightCols(q); | matrix.rightCols(); |
向量的块操作
对于vector也存在分块的操作
块操作 | Version constructing a dynamic-size block expression | Version constructing a fixed-size block expression |
---|---|---|
包含前n个元素 * | vector.head(n); | vector.head |
包含后n个元素 * | vector.tail(n); | vector.head |
包含从i开始的n个元素 * | vector.segment(i,n); | vector.segment |
Example
Block
1 |
|
输出为
1 | Block in the middle |
以上方式都是使用为右值,只读形式
Row & Col
1 |
|
输出为
1 | Here is the matrix m: |
Corner & Line
1 |
|
输出为
1 | m.leftCols(2) = |
Vector Block Operation
1 |
|
输出为
1 | v.head(3) = |