Eigen使用相关问题
1. Diagonal Matrix 的相关操作
当使用vector进行diagonal matrix创建的时候,可以通过
Vector3 aa{1,2,3};
cout << Eigen::Matrix3d(aa.array().pow(2).matrix().asDiagonal()) << endl;
进行创建,但是这里Diagonal Matrix并没有 << 方法,需要转换为Matrix3d进行打印。
也可以通过array()返回进行 power 的操作:
aa.array().pow(2).matrix().asDiagonal();
也可以直接进行构建diagonal矩阵:
aa.asDiagonal();
同样的,我们也可以直接进行Diagonal 矩阵的初始化,即:
Eigen::DiagonalMatrix<double,3> bb;
2. Isometry3d的使用
在我们构建isometry的时候,必须先初始化为单位阵;
Eigen::Isometry3d aa = Eigen::Isometry3d::Identity();
另外,isometry的构建可以通过rotate和pretranslate的方法构建,并且可以通过matrix返回matrix4d类型的变量,其中aa代表的是isometry矩阵,bb代表的是旋转向量。
aa.rotate(Eigen::AngleAxisd(bb.head<3>().norm(), bb.head<3>().normalized()).matrix());
base_T_imu.pretranslate(bb.tail<3>());
pretranslate 的含义是在使用translation的时候不会进行rotate。
3. Matrix和vector的相关操作
Matrix访问元素可以之间通过
直接访问aa(x,y)
块访问aa.block<dim1,dim2>(startx,starty);
块访问aa.topLeftCorner<dim1,dim2>();
Vector访问元素可以通过
直接访问bb(x)
块访问bb.segment<n>(start);
快访问bb.tail<n>()
4. Matrix相关的宏定义
// Create handy typedefs and constants for square-size matrices
// MatrixMN, MatrixN = MatrixNN, I_NxN, and Z_NxN, for M,N=1..9
#define GTSAM_MAKE_MATRIX_DEFS(N) \
typedef Eigen::Matrix<double, N, N> Matrix##N; \
typedef Eigen::Matrix<double, 1, N> Matrix1##N; \
typedef Eigen::Matrix<double, 2, N> Matrix2##N; \
typedef Eigen::Matrix<double, 3, N> Matrix3##N; \
typedef Eigen::Matrix<double, 4, N> Matrix4##N; \
typedef Eigen::Matrix<double, 5, N> Matrix5##N; \
typedef Eigen::Matrix<double, 6, N> Matrix6##N; \
typedef Eigen::Matrix<double, 7, N> Matrix7##N; \
typedef Eigen::Matrix<double, 8, N> Matrix8##N; \
typedef Eigen::Matrix<double, 9, N> Matrix9##N; \
static const Eigen::MatrixBase<Matrix##N>::IdentityReturnType I_##N##x##N = Matrix##N::Identity(); \
static const Eigen::MatrixBase<Matrix##N>::ConstantReturnType Z_##N##x##N = Matrix##N::Zero();
GTSAM_MAKE_MATRIX_DEFS(1);
GTSAM_MAKE_MATRIX_DEFS(2);
GTSAM_MAKE_MATRIX_DEFS(3);
GTSAM_MAKE_MATRIX_DEFS(4);
GTSAM_MAKE_MATRIX_DEFS(5);
GTSAM_MAKE_MATRIX_DEFS(6);
GTSAM_MAKE_MATRIX_DEFS(7);
GTSAM_MAKE_MATRIX_DEFS(8);
GTSAM_MAKE_MATRIX_DEFS(9);
#define GTSAM_MAKE_VECTOR_DEFS(N) \
typedef Eigen::Matrix<double, N, 1> Vector##N; \
static const Eigen::MatrixBase<Vector##N>::ConstantReturnType Z_##N##x1 = Vector##N::Zero();
GTSAM_MAKE_VECTOR_DEFS(4);
GTSAM_MAKE_VECTOR_DEFS(5);
GTSAM_MAKE_VECTOR_DEFS(6);
GTSAM_MAKE_VECTOR_DEFS(7);
GTSAM_MAKE_VECTOR_DEFS(8);
GTSAM_MAKE_VECTOR_DEFS(9);
GTSAM_MAKE_VECTOR_DEFS(10);
GTSAM_MAKE_VECTOR_DEFS(11);
GTSAM_MAKE_VECTOR_DEFS(12);