1.Eigen中矩阵的数据类型
#include <Eigen/Dense> // 基本函数只需要包含这个头文件
Matrix<double, 3, 3> A; // 固定了行数和列数的矩阵和Matrix3d一致.
Matrix<double, 3, Dynamic> B; // 固定行数.
Matrix<double, Dynamic, Dynamic> C; // 和MatrixXd一致.
Matrix<double, 3, 3, RowMajor> E; // 按行存储; 默认按列存储.
Matrix3f P, Q, R; // 3x3 float 矩阵.
Vector3f x, y, z; // 3x1 float 列向量. 3维列向量
RowVector3f a, b, c; // 1x3 float 行向量.
VectorXd v; // 动态长度double型列向量
x.size() // 向量长度
C.rows() // 矩阵行数
C.cols() // 矩阵列数
x(i) // 下标0开始,访问向量元素
C(i,j) //下标从0,0开始,访问矩阵元素
2.Eigen 中的特殊矩阵
MatrixXd::Identity(rows,cols) // 单位矩阵
C.setIdentity(rows,cols) // 单位矩阵
MatrixXd::Zero(rows,cols) // 零矩阵
C.setZero(rows,cols) // 零矩阵
MatrixXd::Ones(rows,cols) // 全一矩阵
C.setOnes(rows,cols) // 全一矩阵
MatrixXd::Random(rows,cols) // 元素随机在-1->1
C.setRandom(rows,cols) // 同上
VectorXd::LinSpaced(size,low,high) // 线性分布的数组
v.setLinSpaced(size,low,high) //线性分布的数组
3.Eigen中矩阵分块
// Eigen
x.head(n) // x(1:n) 用于数组提取前n个[vector]
x.head<n>() // x(1:n) 同理
x.tail(n) // x(end - n + 1: end)同理
x.tail<n>() // x(end - n + 1: end)同理
x.segment(i, n) // x(i+1 : i+n)同理
x.segment<n>(i) // x(i+1 : i+n)同理
P.block(i, j, rows, cols) // P(i+1 : i+rows, j+1 : j+cols)i,j开始,rows行cols列
P.block<rows, cols>(i, j) // P(i+1 : i+rows, j+1 : j+cols)i,j开始,rows行cols列
P.row(i) // P(i+1, :)i行
P.col(j) // P(:, j+1)j列
P.leftCols<cols>() // P(:, 1:cols)左边cols列
P.leftCols(cols) // P(:, 1:cols)左边cols列
P.middleCols<cols>(j) // P(:, j+1:j+cols)中间从j数cols列
P.middleCols(j, cols) // P(:, j+1:j+cols)中间从j数cols列
P.rightCols<cols>() // P(:, end-cols+1:end)右边cols列
P.rightCols(cols) // P(:, end-cols+1:end)右边cols列
P.topRows<rows>() // P(1:rows, :)同列
P.topRows(rows) // P(1:rows, :)同列
P.middleRows<rows>(i) // P(i+1:i+rows, :)同列
P.middleRows(i, rows) // P(i+1:i+rows, :)同列
P.bottomRows<rows>() // P(end-rows+1:end, :)同列
P.bottomRows(rows) // P(end-rows+1:end, :)同列
P.topLeftCorner(rows, cols) // P(1:rows, 1:cols)上左角rows行,cols列
P.topRightCorner(rows, cols) // P(1:rows, end-cols+1:end)上右角rows行,cols列
P.bottomLeftCorner(rows, cols) // P(end-rows+1:end, 1:cols)下左角rows行,cols列
P.bottomRightCorner(rows, cols) // P(end-rows+1:end, end-cols+1:end)下右角rows行,cols列
P.topLeftCorner<rows,cols>() // P(1:rows, 1:cols)同上
P.topRightCorner<rows,cols>() // P(1:rows, end-cols+1:end)同上
P.bottomLeftCorner<rows,cols>() // P(end-rows+1:end, 1:cols)同上
P.bottomRightCorner<rows,cols>() // P(end-rows+1:end, end-cols+1:end)同上
4.Eigen中矩阵的转置
// Eigen
R.adjoint() // R' 伴随矩阵
R.transpose() // R.' or conj(R')转置
R.diagonal() // diag(R)对角
x.asDiagonal() // diag(x)对角阵(没有重载<<)
R.transpose().colwise().reverse(); // rot90(R)所有元素逆时针转了90度
R.conjugate() // conj(R)共轭矩阵
5.Eigen中矩阵乘积
y = M*x;
R = P*Q;
R = P*s;
a = b*M;
R = P - Q;
R = s*P;
a *= M;
R = P + Q;
R = P/s;
R *= Q;
R = s*P;
R += Q;
R *= s;
R -= Q;
R /= s;
6.Eigen中矩阵的单个元素操作
// Eigen
R = P.cwiseProduct(Q); // R = P .* Q 对应点相乘
R = P.array() * s.array(); // R = P .* s 对应点相乘
R = P.cwiseQuotient(Q); // R = P ./ Q 对应点相除
R = P.array() / Q.array(); // R = P ./ Q对应点相除
R = P.array() + s.array(); // R = P + s对应点相加
R = P.array() - s.array(); // R = P - s对应点相减
R.array() += s; // R = R + s全加s
R.array() -= s; // R = R - s全减s
R.array() < Q.array(); // R < Q 以下的都是针对矩阵的单个元素的操作
R.array() <= Q.array(); // R <= Q矩阵元素比较,会在相应位置置0或1
R.cwiseInverse(); // 1 ./ P
R.array().inverse(); // 1 ./ P
R.array().sin() // sin(P)
R.array().cos() // cos(P)
R.array().pow(s) // P .^ s
R.array().square() // P .^ 2
R.array().cube() // P .^ 3
R.cwiseSqrt() // sqrt(P)
R.array().sqrt() // sqrt(P)
R.array().exp() // exp(P)
R.array().log() // log(P)
R.cwiseMax(P) // max(R, P) 对应取大
R.array().max(P.array()) // max(R, P) 对应取大
R.cwiseMin(P) // min(R, P) 对应取小
R.array().min(P.array()) // min(R, P) 对应取小
R.cwiseAbs() // abs(P) 绝对值
R.array().abs() // abs(P) 绝对值
R.cwiseAbs2() // abs(P.^2) 绝对值平方
R.array().abs2() // abs(P.^2) 绝对值平方
(R.array() < s).select(P,Q); // (R < s ? P : Q)这个也是单个元素的操作