eigen矩陣操作練習

2021-10-06 08:02:41 字數 3943 閱讀 5737

//

// created by qian on 19-7-16.

///* 相機位姿用四元數表示 q = [0.35, 0.2, 0.3, 0.1] x,y,z,w

* 注意:輸入時quaterniond(w,x,y,z) w 在前!!!

* 實現:輸出四元素對應的旋轉矩陣,旋轉矩陣的轉置,

* 旋轉矩陣的逆矩陣,旋轉矩陣乘以自身的轉置,驗證旋轉矩陣的正交性

* vector3.normalized的特點是當前向量是不改變的並且返回乙個新的規範化的向量;

* vector3.normalize的特點是改變當前向量,也就是當前向量長度是1

*/#include using namespace std;

#include // eigen 核心部分

#include // 稠密矩陣的代數運算(逆,特徵值等)

#include #include using namespace eigen;

#define matrix_size 50

/****************************

* 本程式演示了 eigen 基本型別的使用

****************************/

int main(int argc, char **ar**)

// 矩陣和向量相乘(實際上仍是矩陣和矩陣)

v_3d << 3, 2, 1;

vd_3d << 4, 5, 6;

// 但是在eigen裡你不能混合兩種不同型別的矩陣,像這樣是錯的

// matrixresult_wrong_type = matrix_23 * v_3d;

// 應該顯式轉換

matrixresult = matrix_23.cast() * v_3d;

cout << "[1,2,3;4,5,6]*[3,2,1]=" << result.transpose() << endl;

matrixresult2 = matrix_23 * vd_3d;

cout << "[1,2,3;4,5,6]*[4,5,6]: " << result2.transpose() << endl;

// 同樣你不能搞錯矩陣的維度

// 試著取消下面的注釋,看看eigen會報什麼錯

// eigen::matrixresult_wrong_dimension = matrix_23.cast() * v_3d;

// 一些矩陣運算

// 四則運算就不演示了,直接用+-*/即可。

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; // 行列式

// 特徵值

// 實對稱矩陣可以保證對角化成功

selfadjointeigensolvereigen_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 這個方程

// n的大小在前邊的巨集裡定義,它由隨機數生成

// 直接求逆自然是最直接的,但是求逆運算量大

matrixmatrix_nn

= matrixxd::random(matrix_size, matrix_size);

matrix_nn = matrix_nn * matrix_nn.transpose(); // 保證半正定

matrixv_nd = matrixxd::random(matrix_size, 1);

clock_t time_stt = clock(); // 計時

// 直接求逆

matrixx = 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;

}

eigen幾何模組

#include #include using namespace std;

#include #include using namespace eigen;

// 本程式演示了 eigen 幾何模組的使用方法

int main(int argc, char **ar**)

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;

}

cmake_minimum_required(version 3.14)

project(slampractice)

#新增標頭檔案

include_directories(「usr/include/eigen3」)

set(cmake_cxx_standard 11)

add_executable(slampractice main.cpp practice2.cpp)

Eigen的常用矩陣型別和行列操作

eigen矩陣可以使用成員函式col int i row i 對矩陣的行列進行賦值,要注意的是左值和右值為同乙個矩陣中的塊時容易出現bug,盡量使用中間變數去避免這種情況,乙個示例如下 include includeusing namespace std int main eigen matrix3...

Qt使用Eigen矩陣庫

eigen官網 解壓後放在任意資料夾內,然後在qt專案中的pro檔案中加上eigen的目錄 如果沒有載入成功,重新構築即可 includepath d eigen3新增標頭檔案 include定義向量 字尾是變數型別,例如float矩陣是matrix2f vector2d a 5.0,6.0 cou...

矩陣入門(Eigen和Opencv類似)

1 eigen矩陣定義 eigen定義 型別 行 列 matrix eg.matrix型別為浮點型3行4列的矩陣 1 2 3 4 2 2 3 4 3 2 3 4 2 預定義的特殊矩陣vector列矩陣 rowvector行矩陣 eg.vector3d matrix 為3行1列的矩陣 eg.rowve...