头文件
#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 中的每个元素乘以10cout << "------*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的单位矩阵R1Eigen::Matrix3d R1 = Eigen::Matrix3d::Identity();std::cout << "Rotation_matrix" << std::endl << R1;std::cout << "-----------------------" << std::endl;return 0;
}