//// 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...