Eigen矩阵模板类------c++

1 篇文章 0 订阅

头文件

#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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值