头文件
#include <Eigen/Core>
#include <Eigen/Dense>
矩阵
// 定义了一个2x3的浮点型矩阵
Eigen::Matrix<float, 2, 3> matrix_23;
matrix_23 << 1, 2, 3, 4, 5, 6;
cout << "matri_23=" << endl;
cout << matrix_23 << endl;
// 单个元素访问
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << matrix_23(i, j) << "\t";
cout << endl;
}
}
cout << "------------" << endl;
向量
// 定义了一个3维的双精度浮点型向量
Eigen::Vector3d v_3d;
v_3d << 3, 2, 1;
cout << "v_3d=" << endl;
cout << v_3d << endl;
cout << "------------" << endl;
乘法
// 定义了一个2x3的浮点型矩阵
Eigen::Matrix<float, 2, 3> matrix_23;
matrix_23 << 1, 2, 3, 4, 5, 6;
cout << "matri_23=" << endl;
cout << matrix_23 << endl;
cout << "------------" << endl;
// 定义了一个3维的双精度浮点型向量
Eigen::Vector3d v_3d;
v_3d << 3, 2, 1;
cout << "v_3d=" << endl;
cout << v_3d << endl;
cout << "------------" << endl;
// 定义了一个3x1的浮点型矩阵
Eigen::Matrix<float, 3, 1> vd_3d;
vd_3d << 4, 5, 6;
cout << "vd_3d=" << endl;
cout << vd_3d << endl;
cout << "------------" << endl;
// 矩阵 matrix_23 转换为双精度浮点型,与向量 v_3d 相乘
Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
cout << result << endl;
cout << "------------" << endl;
// 将矩阵 matrix_23 与向量 vd_3d 相乘
Eigen::Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;
cout << result2 << endl;
随机矩阵
// 定义了一个3x3的双精度浮点型矩阵 matrix_33,并初始化为零矩阵
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
cout << matrix_33 << endl;
// 生成一个3x3的随机双精度浮点型矩阵 matrix_33,并将其打印
matrix_33 = Eigen::Matrix<double, 3, 3>::Random();
cout << matrix_33 << endl;
矩阵的属性
// 定义了一个3x3的双精度浮点型矩阵 matrix_33,并初始化为零矩阵
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
cout << matrix_33 << endl;
cout << "------随机------" << endl;
// 生成一个3x3的随机双精度浮点型矩阵 matrix_33,并将其打印
matrix_33 = Eigen::Matrix<double, 3, 3>::Random();
cout << matrix_33 << endl;
cout << "------转置------" << endl;
// 打印 matrix_33 的转置矩阵
cout << matrix_33.transpose() << endl;
// 打印 matrix_33 的逆矩阵
cout << "------逆矩阵------" << endl;
cout << matrix_33.inverse() << endl;
// 分别打印 matrix_33 的元素之和(两个同型矩阵相加)
cout << "------和------" << endl;
cout << matrix_33.sum() << endl;
// 分别打印 matrix_33 的元素的迹(矩阵主对角线上元素的和)
cout << "------迹------" << endl;
cout << matrix_33.trace() << endl;
// 将 matrix_33 中的每个元素乘以10
cout << "------*10------" << endl;
cout << 10 * matrix_33 << endl;
cout << "------决定因素------" << endl;
// 方阵特有的一个标量值,它表示矩阵对空间的扭曲程度或者说变换的因子
cout << matrix_33.determinant() << endl;
特征值和特征向量
// 定义了一个3x3的双精度浮点型矩阵 matrix_33,并初始化为零矩阵
Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();
cout << matrix_33 << endl;
cout << "------随机------" << endl;
// 生成一个3x3的随机双精度浮点型矩阵 matrix_33,并将其打印
matrix_33 = Eigen::Matrix<double, 3, 3>::Random();
cout << matrix_33 << endl;
// 使用自共轭特征值求解器求解 matrix_33 转置矩阵与自身的乘积的特征值和特征向量
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
cout << "Eigen value = \n"
<< eigen_solver.eigenvalues() << endl; // 特征值
cout << "Eigen vectors = \n"
<< eigen_solver.eigenvectors() << endl; // 特征向量
矩阵旋转
using namespace std;
#include <Eigen/Core>
#include <Eigen/Geometry>
int main(int argc, char **argv)
{
// 3x3的单位矩阵,表示没有任何旋转
Eigen::Matrix3d roration_matrix = Eigen::Matrix3d::Identity();
cout << roration_matrix << endl;
// 创建一个角轴对象,表示绕Z轴旋转45度
Eigen::AngleAxisd roration_vector(M_PI / 4, Eigen::Vector3d(0, 0, 1));
// 将角轴对象转换为旋转矩阵,并输出将向量(1,0,0)旋转后的结果
cout.precision(3);
roration_matrix = roration_vector.toRotationMatrix();
cout << "(1,0,0) after roration" << roration_matrix.transpose() << endl;
// 使用角轴对象直接将向量(1,0,0)进行旋转
Eigen::Vector3d v(1, 0, 0);
Eigen::Vector3d v_rorate = roration_vector * v;
cout << "(1,0,0) after roration driectly" << v_rorate.transpose() << endl;
// 使用旋转矩阵将向量(1,0,0)进行旋转
v_rorate = roration_matrix * v;
cout << "(1,0,0) after roration" << v_rorate.transpose() << endl;
// 获取旋转矩阵对应的欧拉角
Eigen::Vector3d euler_angle = roration_matrix.eulerAngles(2, 1, 0);
cout << "yaw pitch roll" << euler_angle.transpose() << endl;
// 创建一个等距变换矩阵,先旋转后平移
Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
T.rotate(roration_vector);
T.pretranslate(Eigen::Vector3d(1, 3, 4));
cout << "Transform matrix = \n" << T.matrix() << endl;
// 使用等距变换矩阵将向量v进行变换
Eigen::Vector3d v_transformed = T * v;
cout << "v tranform = " << v_transformed.transpose() << endl;
// 创建一个四元数对象,表示与角轴对象对应的旋转
Eigen::Quaterniond q = Eigen::Quaterniond(roration_vector);
cout << " quaterniond = \n" << q.coeffs() << endl;
// 重新设置四元数对象
q = Eigen::Quaterniond(roration_vector);
cout << "quaterniond = \n " << q.coeffs() << endl;
// 使用四元数对象将向量(1,0,0)进行旋转
v_rorate = q * v;
cout << "(1,0,0) after roration" << v_rorate.transpose() << endl;
std::cout << "Hello, world!" << std::endl;
return 0;
}
#include <Eigen/Core>
#include <Eigen/Geometry>
int main(int argc, char **argv)
{
// 创建一个角轴对象t_v,表示绕Z轴旋转45度。然后,通过matrix()函数将角轴对象转换为旋转矩阵t_R,并通过transpose()函数输出转置后的旋转矩阵
Eigen::AngleAxisd t_v(M_PI / 4, Eigen::Vector3d(0, 0, 1));
Eigen::Matrix3d t_R = t_v.matrix();
Eigen::Quaterniond t_Q(t_v);
std::cout << "t_R = \n" << t_R.transpose() << std::endl;
// std::cout<<"t_Q = \n"<<t_Q<<endl;
// 使用fromRotationMatrix()函数将旋转矩阵t_R转换为角轴对象V2,并直接将t_R赋值给角轴对象V3,然后输出V3对应的旋转矩阵
Eigen::AngleAxisd V2;
V2.fromRotationMatrix(t_R);
Eigen::AngleAxisd V3;
V3 = t_R;
std::cout << "V3\n" << V3.matrix() << std::endl;
// 直接将旋转矩阵t_R传递给角轴对象V4,并输出V4对应的旋转矩阵
Eigen::AngleAxisd V4(t_R);
std::cout << "V4\n" << V4.matrix() << std::endl;
// 将四元数对象t_Q传递给角轴对象V5,并输出V5对应的旋转矩阵
Eigen::AngleAxisd V5(t_Q);
std::cout << "V5\n" << V5.matrix() << std::endl;
// 手动创建一个四元数对象Q1,然后分别输出其系数和对应的旋转矩阵
Eigen::Quaterniond Q1(cos((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 1 * sin((M_PI / 4) / 2));
std::cout << "Quaterniond\n" << Q1.coeffs() << std::endl;
std::cout << "Quaterniond\n" << Q1.matrix() << std::endl;
// 分别输出四元数对象Q1的四个系数
std::cout << Q1.x() << std::endl;
std::cout << Q1.y() << std::endl;
std::cout << Q1.z() << std::endl;
std::cout << Q1.w() << std::endl;
// 创建一个3x3的单位矩阵R1
Eigen::Matrix3d R1 = Eigen::Matrix3d::Identity();
std::cout << "Rotation_matrix" << std::endl << R1;
std::cout << "-----------------------" << std::endl;
return 0;
}