【視覺SLAM十四講學習筆記】第三講——Eigen庫

專欄系列文章如下:
【視覺SLAM十四講學習筆記】第一講——SLAM介紹
【視覺SLAM十四講學習筆記】第二講——初識SLAM
【視覺SLAM十四講學習筆記】第三講——旋轉矩陣

本章將介紹視覺SLAM的基本問題之一:如何描述剛體在三維空間中的運動

Eigen

Eigen是一個C++開源線性代數庫。它提供了快速的有關矩陣的線性代數運算,還包括解方程等功能。

請輸入以下命令進行安裝:

sudo apt-get install libeigen3-dev

與其他庫相比,Eigen的特殊之處在于,它是一個純用頭文件搭建起來的庫,這意味著你只能找到它的頭文件,而沒有類似.so或者.a的二進制文件。在使用時,只需引入Eigen的頭文件即可,不需要鏈接庫文件(因為它沒有庫文件)。接下來對這個庫的使用做一些示例:

#include <iostream>using namespace std;#include <ctime>
// Eigen 核心部分
#include <Eigen/Core>
// 稠密矩陣的代數運算(逆,特征值等)
#include <Eigen/Dense>using namespace Eigen;int main(int argc, char **argv) {// Eigen 中所有向量和矩陣都是Eigen::Matrix,它是一個模板類。它的前三個參數為:數據類型,行,列// 聲明一個2*3的float矩陣Matrix<float, 2, 3> matrix_23;// 同時,Eigen 通過 typedef 提供了許多內置類型,不過底層仍是Eigen::Matrix// 例如 Vector3d 實質上是 Eigen::Matrix<double, 3, 1>,即三維向量Vector3d v_3d;// 這是一樣的Matrix<float, 3, 1> vd_3d;// Matrix3d 實質上是 Eigen::Matrix<double, 3, 3>Matrix3d matrix_33 = Matrix3d::Zero(); //初始化為零// 如果不確定矩陣大小,可以使用動態大小的矩陣Matrix<double, Dynamic, Dynamic> matrix_dynamic;// 更簡單的MatrixXd matrix_x;// 這種類型還有很多,我們不一一列舉// 下面是對Eigen陣的操作// 輸入數據(初始化)matrix_23 << 1, 2, 3, 4, 5, 6;// 輸出cout << "matrix 2x3 from 1 to 6: \n" << matrix_23 << endl;// 用()訪問矩陣中的元素cout << "print matrix 2x3: " << endl;for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) cout << matrix_23(i, j) << "\t";cout << endl;}return 0;
}

輸出結果:

matrix 2x3 from 1 to 6: 
1 2 3
4 5 6
print matrix 2x3: 
1	2	3	
4	5	6	

矩陣運算:

#include <iostream>using namespace std;#include <ctime>
#include <Eigen/Core>
#include <Eigen/Dense>using namespace Eigen;int main(int argc, char **argv) {// Eigen 中所有向量和矩陣都是Eigen::Matrix,它是一個模板類。它的前三個參數為:數據類型,行,列// 聲明一個2*3的float矩陣Matrix<float, 2, 3> matrix_23;Vector3d v_3d;Matrix<float, 3, 1> vd_3d;// Matrix3d 實質上是 Eigen::Matrix<double, 3, 3>Matrix3d matrix_33 = Matrix3d::Zero(); //初始化為零// 下面是對Eigen陣的操作// 輸入數據(初始化)matrix_23 << 1, 2, 3, 4, 5, 6;// 矩陣和向量相乘(實際上仍是矩陣和矩陣)v_3d << 3, 2, 1;vd_3d << 4, 5, 6;// 但是在Eigen里你不能混合兩種不同類型的矩陣,像這樣是錯的// Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;// 應該顯式轉換Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;cout << "[1,2,3;4,5,6]*[3,2,1]=" << result.transpose() << endl;Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;cout << "[1,2,3;4,5,6]*[4,5,6]: " << result2.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;    // 行列式// 特征值// 實對稱矩陣可以保證對角化成功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;return 0;
}	

輸出結果:

[1,2,3;4,5,6]*[3,2,1]=10 28
[1,2,3;4,5,6]*[4,5,6]: 32 77
random matrix: 0.680375   0.59688 -0.329554
-0.211234  0.823295  0.5364590.566198 -0.604897 -0.444451
transpose: 0.680375 -0.211234  0.5661980.59688  0.823295 -0.604897
-0.329554  0.536459 -0.444451
sum: 1.61307
trace: 1.05922
times 10: 6.80375   5.9688 -3.29554
-2.11234  8.23295  5.364595.66198 -6.04897 -4.44451
inverse: 
-0.198521   2.22739    2.83571.00605 -0.555135  -1.41603-1.62213   3.59308   3.28973
det: 0.208598
Eigen values = 
0.02428990.9921541.80558
Eigen vectors = 
-0.549013 -0.735943  0.3961980.253452 -0.598296 -0.760134
-0.796459  0.316906 -0.514998

解方程:

#include <iostream>
#include <ctime>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;#define MATRIX_SIZE 50int main(int argc, char **argv) {// 解方程// 我們求解 matrix_NN * x = v_Nd 這個方程// N的大小在前邊的宏里定義,它由隨機數生成// 直接求逆自然是最直接的,但是求逆運算量大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;
}

結果如下:

time of normal inverse is 2.606ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734
time of Qr decomposition is 3.419ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734
time of ldlt decomposition is 1.38ms
x = -55.7896 -298.793  130.113 -388.455 -159.312  160.654 -40.0416 -193.561  155.844  181.144  185.125 -62.7786  19.8333 -30.8772 -200.746  55.8385 -206.604  26.3559 -14.6789  122.719 -221.449   26.233  -318.95 -78.6931  50.1446  87.1986 -194.922  132.319  -171.78 -4.19736   11.876 -171.779  48.3047  84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237  28.9419  111.421  92.1237 -288.248 -23.3478  -275.22 -292.062  -92.698  5.96847 -93.6244  109.734

這個例程演示了Eigen矩陣的基本操作與運算。要編譯它,需要在CMakeLists.txt里指定Eigen的頭文件目錄:

#添加頭文件
include_directories("/usr/include/eigen3")

因為Eigen庫只有頭文件,所以不需要再用target_link_libraries語句將程序鏈接到庫上。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網工內推 | Base北京,國企網工運維,最高30k*14薪,IE認證優先

01 萬方數據股份有限公司 招聘崗位&#xff1a;網絡工程師 職責描述&#xff1a; 1.負責完成基礎網絡組網工作&#xff1b; 2.負責網絡對象的訪問控制及安全策略&#xff0c;配置VLan&#xff0c;黑白名單、地址轉換、故障排查及網絡安全監控工作&#xff1b; 3.負責對操作系…

Vue框架學習筆記——Vue實例中el和data的兩種寫法

文章目錄 前文提要Vue實例的el第一種寫法第二種寫法小結 Vue實例中data第一種寫法&#xff0c;對象式效果圖片第二種寫法&#xff0c;函數式效果圖片小結 前文提要 本文僅做自己的學習記錄&#xff0c;如有錯誤&#xff0c;請多諒解 Vue實例的el 第一種寫法 <body><…

Python圖片文件和base64編碼互轉

圖片和base64編碼互轉 import base64 import cv2# 將圖片base64字符串生成圖片文件. def base64_to_img(base64_code,save_img_path):"""根據base64生成圖片.:param base64_code: 圖片的base64文件:param save_img_path: 生成的圖片路徑:returns: None"&q…

分布式鎖之基于mysql實現分布式鎖(四)

不管是jvm鎖還是mysql鎖&#xff0c;為了保證線程的并發安全&#xff0c;都提供了悲觀獨占排他鎖。所以獨占排他也是分布式鎖的基本要求。 可以利用唯一鍵索引不能重復插入的特點實現。設計表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

(二)C語言之變量與算數運算表達式概述

C語言之變量與算數運算表達式概述 一、華氏溫度與攝氏溫度對照二、代碼概述三、練習 一、華氏溫度與攝氏溫度對照 #include <stdio.h>/*當華氏溫度為 0,20,40,...300時&#xff0c;打印出華氏溫度與攝氏溫度對照表華氏溫度與攝氏溫度 C(5/9)(?F-32) 其中C表示攝氏溫度&…

順序棧和鏈棧

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//順序棧 //構造一個空棧 int InitStack(SqStack& s) { s.base new SElemType…

Django之中間件與CSRF_TOKEN

文章目錄 一、什么是中間件二、中間件有什么用三、Django自定義中間件中間件中主要方法及作用創建自定義中間件的步驟&#xff1a;process_request與process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…

mysql latin-1報錯解決

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表聲明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解決這個報錯,需要在創建mysql連接時候…

面試:RabbitMQ相關問題

文章目錄 簡單介紹RabbitMQRabbitMQ架構什么是 RabbitMQ&#xff1f;有什么顯著的特點&#xff1f;RabbitMQ 有那些基本概念&#xff1f;RabbitMQ routing 路由模式消息怎么路由&#xff1f;RabbitMQ publish/subscribe 發布訂閱(共享資源)能夠在地理上分開的不同數據中心使用 …

vue2指令的使用和自定義指令

前言 個人認為vue的指令,對比react來說,給開發者節省了很大的學習成本。比如在react中,你想渲染一個列表,需要用Array.map的方法return<div>,而在vue中,一個簡單的v-for就解決了問題。 在學習成本和入手體驗上,vue的作者確實后來者居上,能讓人更快的使用vue開發。不過也…

無邊界電視點播TVbox殼+源

TBBox可以是個盒子也可以是軟件 視頻播放的困局新的改變TVBox apk更成熟的熊貓寶盒_3.10還有這個沒測試恒星TV 寫在最后 視頻播放的困局 現在電視上幾大平臺看劇集都要充會員&#xff0c;而電腦上網頁端有很多可以看的網頁&#xff0c;只有 隨便一搜就測出來&#xff0c;只是經…

數據安全第一:應對[[MyFile@waifu.club]].wis勒索病毒的實用建議與技巧

引言&#xff1a; 在當今數字化時代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一種惡意軟件&#xff0c;其危害用戶數據安全&#xff0c;通過加密文件并勒索贖金來獲取經濟利益。以下是對[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

進入PyTorch的官網&#xff1a; pytorch GitHub 點擊GitHub&#xff1a; 進入PyTorch的主目錄&#xff1a; 進入Vision reference&#xff1a; detection&#xff1a; 這就是我們在訓練過程中會使用到的文件了&#xff1a;

objdump反匯編文件解析

命令使用 objdump可以對可執行文件進行反匯編 其常用參數為: objdump -d <file(s)>: 將代碼段反匯編&#xff1b;objdump -S <file(s)>: 將代碼段反匯編的同時&#xff0c;將反匯編代碼與源代碼交替顯示&#xff0c;編譯時需要使用-g參數&#xff0c;即需要調試信…

Hadoop技術與應用的習題

第一章測驗 1、下面哪個選項不屬于Google的三駕馬車&#xff1f; A.HDFS B.MapReduce C.BigTable D.GFS 2、下面哪個思想是為了解決PageRank&#xff08;網頁排名&#xff09;的問題&#xff1f; A.GFS B.BigTable C.MapReduce D.YARN 3、GFS 存儲的文件都被分割成固定大小的…

CAN基礎知識

CAN 簡介 CAN 是 Controller Area Network 的縮寫&#xff08;以下稱為 CAN&#xff09;&#xff0c;是 ISO 國際標準化的串行通信 協議。在當前的汽車產業中&#xff0c;出于對安全性、舒適性、方便性、低公害、低成本的要求&#xff0c;各種 各樣的電子控制系統被開發了出來…

簡單的用Python采集股票數據,保存表格后分析歷史數據

前言 字節跳動如果上市&#xff0c;那么鐘老板將成為我國第一個世界首富 趁著現在還沒上市&#xff0c;咱們提前學習一下用Python分析股票歷史數據&#xff0c;抱住粗大腿坐等起飛~ 好了話不多說&#xff0c;我們直接開始正文 準備工作 環境使用 Python 3.10 解釋器Pychar…

如何應用ChatGPT撰寫、修改論文及工作報告,提供寫作能力及優化工作??

如果我想讓gpt從pdf文檔中提取相關關鍵詞的內容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我們評論區討論 ChatGPT 在論文寫作與編程方面也具備強大的能力。無論是進行代碼生成、錯誤調試還是解決編程難題&#xff0c;ChatGPT都能為您提供實用且高質量的建議和指導&am…

愛上C語言:scanf、gets以及getchar輸入字符串你真的懂了嗎

&#x1f680; 作者&#xff1a;阿輝不一般 &#x1f680; 你說呢&#xff1a;不服輸的你&#xff0c;他們拿什么贏 &#x1f680; 專欄&#xff1a;愛上C語言 &#x1f680;作圖工具&#xff1a;draw.io(免費開源的作圖網站) 如果覺得文章對你有幫助的話&#xff0c;還請點贊…

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…