矩阵 Matrix
该类型用于存储一个稠密矩阵
|
分类
静态大小
在编译时确定对应的行列数,内存会优先分配在栈上(过大的会分配到堆上)
动态大小
在编译时,对于的行列数设置为Dynamic,由运行时确定,内存会分配在堆上
向量 Vector
行或列维数为一的矩阵
简化名称
|
方法
构造
|
系数访问
|
流式赋值
|
生成随机矩阵
|
生成特殊矩阵
|
矩阵大小
|
调整矩阵形状
|
矩阵运算
|
同型矩阵间加减
|
矩阵与系数乘除法
|
矩阵间乘法
|
点乘和叉乘
|
矩阵的分组
求矩阵的特殊值
矩阵分部分
|
|
实现了矩阵加法(第二行系数加一)
常见的特殊值
|
求范数
Lp范数的公式
|
求布尔值
|
获取特殊矩阵
| 特殊矩阵 | 符号 | ||
|---|---|---|---|
| 转置矩阵 |
|
Transpose | .transpose() |
| 共轭矩阵 |
|
Conjugate | .conjugate() |
| 共轭转置(埃尔米特伴随) |
|
Hermitian adjoint | .adjoint() |
| 古典伴随矩阵 |
|
Adjugate matrix | .adjugate() |
|
提前求值
|
数组 Array
和矩阵 Matrix的区别
数组相对于矩阵,更关注的是其上每一系数的计算。
在表现形式上,主要区别是数组间的加减乘是按位(一一对应)进行的。
结构
| 类型 | 简化名称 | |
|---|---|---|
| Array<float,Dynamic,1> | ArrayXf | |
| Array<float,3,1> | Array3f | ArrayNf |
| Array<double,Dynamic,Dynamic> | ArrayXXd | |
| Array<double,3,3> | Array33d | ArrayNNd |
方法
和数组之间的转换
|
数组间加减乘
|
数值计算
|
块 Block (切片对象)
功能
用于在矩阵或数组中,获取一个局部的数据块。
序列类型 Seq
|
赋值
在赋值时,和Matrix一样支持使用<<进行流式赋值。
获取 Block
基本方法
|
基于序列获取
| 方法 | 代码 | 等价方法 |
|---|---|---|
| 左下角由i行开始的n列 | A(seq(i,last), seqN(0,n)) |
A.bottomLeftCorner(A.rows()-i,n) |
| 由i,j开始的m行n列 | A(seqN(i,m), seqN(j,n)) |
A.block(i,j,m,n) |
| 由i0,j0开始,由i1,j1结束 | A(seq(i0,i1), seq(j0,j1)) |
A.block(i0,j0,i1-i0+1,j1-j0+1) |
| 偶数列 | A(all, seq(0,last,2)) |
|
| 前n个奇数行 | A(seqN(1,n,2), all) |
|
| 倒数第二列 | A(all, last-1) |
A.col(A.cols()-2) |
| 中间行 | A(last/2, all) |
A.row((A.rows()-1)/2) |
| 向量由i位起始后的所有元素 | v(seq(i,last)) |
v.tail(v.size()-i) |
| 向量后n个元素 | v(seq(last+1-n,last))v(lastN(n)) |
v.tail(n) |
| 右下角的m行n列矩阵 | A(lastN(m), lastN(n)) |
|
| 后n列(经过3个获取一列) | A(all, lastN(n,3)) |
|
上述的all,在代码中使用Eigen::placeholders::all |
||
序列对象可以使用c/c++风格{...},std::vector<int>, std::array<int,N>替换,也可以是ArrayXi |
||
可以使用Eigen::fix<val>,使编译时确定需要的序列号。Eigen::last表示从矩阵末尾开始,表达形式为v(seq(last-fix<7>, last-fix<2>)) |
基于序列获取逆序
|
特殊方法
| 方法功能 | 动态大小 | 静态大小 |
|---|---|---|
| 左上角p行q列 | matrix.topLeftCorner(p,q); |
matrix.topLeftCorner<p,q>(); |
| 左下角p行q列 | matrix.bottomLeftCorner(p,q); |
matrix.bottomLeftCorner<p,q>(); |
| 右上角p行q列 | matrix.topRightCorner(p,q); |
matrix.topRightCorner<p,q>(); |
| 右下角p行q列 | matrix.bottomRightCorner(p,q); |
matrix.bottomRightCorner<p,q>(); |
| 前q行 | matrix.topRows(q); |
matrix.topRows<q>(); |
| 后q行 | matrix.bottomRows(q); |
matrix.bottomRows<q>(); |
| 左p列 | matrix.leftCols(p); |
matrix.leftCols<p>(); |
| 右p列 | matrix.rightCols(q); |
matrix.rightCols<q>(); |
| 由i开始的q列 | matrix.middleCols(i,q); |
matrix.middleCols<q>(i); |
| 由i开始的q行 | matrix.middleRows(i,q); |
matrix.middleRows<q>(i); |
仅向量支持的Block操作
| 方法 | 动态大小 | 静态大小 |
|---|---|---|
| 前n个 | vector.head(n); |
vector.head<n>(); |
| 后n个 | vector.tail(n); |
vector.tail<n>(); |
| 由i开始的n个 | vector.segment(i,n); |
vector.segment<n>(i); |
内存映射 Map
功能
用于将C/C++数组对象,以指针的形式,转换为一个可供Eigen使用的对象。
可以理解为一个包装器。
不负责管理内存。
|
可以像Matrix一样去使用该对象。