eigen在c++的基本使用,矩阵运算,几何运算

2024-05-06 18:44

本文主要是介绍eigen在c++的基本使用,矩阵运算,几何运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

矩阵运算

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.2)
project(useEigen)set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")include_directories("/usr/include/eigen3")
add_executable(eigenMatrix eigenMatrix.cpp)

eigenMatrix.cpp文件

#include <iostream>using namespace std;#include <ctime>
#include <eigen3/Eigen/Core> // Eigen 核心部分
#include <eigen3/Eigen/Dense> // 稠密矩阵的代数运算(逆,特征值等)using namespace Eigen;#define MATRIX_SIZE 10int main(int argc, char **argv) {Matrix<float, 2, 3> matrixf_23;matrixf_23 << 1, 2, 3, 4, 5, 6;cout << "matrix 2x3 from 1 to 6: \n" << matrixf_23 << endl;Vector3d v_3d; // //本质是Matrix<double,3,1>v_3d << 3, 2, 1;Matrix3d matrix_33 = Matrix3d::Zero(); //本质是Matrix<double,3,3>,这里初始化为零Matrix<double, Dynamic, Dynamic> matrix_x; // 动态矩阵,不确定矩阵大小,等效于MatrixXd matrix_x;// Eigen里你不能混合两种不同类型的矩阵,像这样是错的// Matrix<double, 2, 1> result_wrong_type = matrixf_23 * v_3d;// 应该显式转换Matrix<double, 2, 1> result = matrixf_23.cast<double>() * v_3d;cout << "[1,2,3;4,5,6]*[3,2,1]=" << result.transpose() << endl;// 一些矩阵运算,四则运算直接用+-*/即可matrix_33 = Matrix3d::Random();                             // 随机数矩阵cout << "random matrix: \n" << matrix_33 << endl;cout << "transpose: \n" << matrix_33.transpose() << endl;   // 转置cout << "sum: " << matrix_33.sum() << endl;                 // 元素和cout << "trace: " << matrix_33.trace() << endl;             // 迹cout << "times 10: \n" << 10 * matrix_33 << endl;           // 数乘cout << "inverse: \n" << matrix_33.inverse() << endl;       // 逆cout << "det: " << matrix_33.determinant() << endl;         // 行列式// 特征值与特征向量, 这里使用AD分解,实对称矩阵可以保证对角化成功SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;// 解方程,求解 matrix_NN * x = v_Nd 这个方程Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN = MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);matrix_NN = matrix_NN * matrix_NN.transpose();  // 保证半正定Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE, 1);clock_t time_stt = clock(); // 计时// 直接求逆自然是最直接的,但是求逆运算量大Matrix<double, MATRIX_SIZE, 1> x = matrix_NN.inverse() * v_Nd;cout << "time of normal inverse is " << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;cout << "x = " << x.transpose() << endl;// 通常用矩阵分解来求,如QR分解,速度会快很多time_stt = clock();x = matrix_NN.colPivHouseholderQr().solve(v_Nd);cout << "time of Qr decomposition is " << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;cout << "x = " << x.transpose() << endl;// 对于正定矩阵,可以用cholesky分解来解方程time_stt = clock();x = matrix_NN.ldlt().solve(v_Nd);cout << "time of ldlt decomposition is " << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;cout << "x = " << x.transpose() << endl;return 0;
}

几何运算

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.2)
project(useEigen)set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")include_directories("/usr/include/eigen3")
add_executable(eigenGeometry eigenGeometry.cpp)

eigenGeometry.cpp文件

#include <iostream>
#include <cmath>using namespace std;#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>using namespace Eigen;// Eigen几何模块的使用方法,Geometry模块提供了各种旋转和平移的表示int main(int argc, char **argv) {cout.precision(3); // 设置了cout流的输出精度,使其仅保留小数点后三位Vector3d v(1, 0, 0);// 3D旋转矩阵,直接使用 Matrix3d 或 Matrix3fMatrix3d rotation_matrix = Matrix3d::Identity();// 旋转向量,使用AngleAxis, 它底层不直接是Matrix,但运算可以当作矩阵(因为重载了运算符)AngleAxisd rotation_vector(M_PI/4,Vector3d(0,0,1));  // 沿Z轴旋转 45 度cout << "rotation matrix =\n" << rotation_vector.matrix() << endl;      // 将旋转向量转换成旋转矩阵rotation_matrix = rotation_vector.toRotationMatrix();                   // 也可以直接赋值Vector3d v_rotated = rotation_vector * v;   // 旋转向量执行坐标变换cout << "(1,0,0) after rotation (by angle axis) = " << v_rotated.transpose() << endl;v_rotated = rotation_matrix * v;            // 旋转矩阵执行坐标变换cout << "(1,0,0) after rotation (by matrix) = " << v_rotated.transpose() << endl;// 欧拉角: 可以将旋转矩阵直接转换成欧拉角Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0); // ZYX顺序,即yaw-pitch-roll顺序cout << "yaw pitch roll = " << euler_angles.transpose() << endl;// 欧氏变换矩阵使用IsometryIsometry3d T = Isometry3d::Identity();              // 虽然称为3d,实质上是4*4的矩阵T.rotate(rotation_vector);                  // 设置旋转T.pretranslate(Vector3d(1, 3, 4));   // 设置平移cout << "Transform matrix = \n" << T.matrix() << endl;Vector3d v_transformed = T * v;                     // 变换矩阵进行坐标变换,相当于R*v+tcout << "v tranformed = " << v_transformed.transpose() << endl;// 对于仿射和射影变换,使用Affine3d和Projective3d即可,略// 四元数QuaterniondQuaterniond q = Quaterniond(rotation_vector);  // 可以直接把旋转向量赋值给四元数,反之亦然cout << "quaternion from rotation vector = " << q.coeffs().transpose() << endl;   // coeffs的顺序是(v,s)q = Quaterniond(rotation_matrix); // 也可以把旋转矩阵赋给四元数cout << "quaternion from rotation matrix = " << q.coeffs().transpose() << endl;v_rotated = q*v;                        // 使用四元数旋转一个向量,使用重载的乘法即可cout << "(1,0,0) after rotation = " << v_rotated.transpose() << endl;cout << "should be equal to " << (q*Quaterniond(0,1,0,0)*q.inverse()).coeffs().transpose() << endl;return 0;
}

这篇关于eigen在c++的基本使用,矩阵运算,几何运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965077

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象