深蓝学院-视觉SLAM理论与实践-第十二期-第2章作业
熟悉Eigen矩陣運算
設線性方程 A x = b Ax = b Ax=b,在 A A A為方陣的前提下,請回答以下問題:
問題1:什么條件下,x有解且唯一?
矩陣A非奇異,滿秩。
問題2:高斯消元法的原理是什么?
高斯消元法主要可以分成三步:
問題3:QR分解的原理是什么?
定義
一個矩陣 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aKT6i2Zf-1645373936195)(https://www.zhihu.com/equation?tex=A+%5Cin+%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes+n%7D%2C%5C+m%5Cge+n)] 可以被分解成 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kh7NRC6t-1645373936196)(https://www.zhihu.com/equation?tex=A+%3D+QR)] ,其中:
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-laWYSFHd-1645373936198)(https://www.zhihu.com/equation?tex=Q%5Cin+%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes+m%7D)] 是正交矩陣
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fRvFCdf8-1645373936199)(https://www.zhihu.com/equation?tex=R+%5Cequiv++%5Cbegin%7Bbmatrix%7D+%5Chat%7BR%7D+%5C%5C+0+%5Cend%7Bbmatrix%7D+%5Cin+%5Cmathbb%7BR%7D%5E%7Bm%5Ctimes+n%7D)]
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MuJV29qT-1645373936201)(https://www.zhihu.com/equation?tex=%5Chat%7BR%7D+%5Cin+%5Cmathbb%7BR%7D%5E%7Bn%5Ctimes+n%7D)] 是上三角矩陣
原理/自己的一些理解
? 如果我們把A矩陣看成是n個m維的列向量,那么QR分解實際上在是選擇一組正交基底(矩陣Q),使得變換后每一個列向量(矩陣R從左至右)所關聯的緯度逐漸增高。這里如果一個向量在某個緯度上數據不是0,就認為他們是關聯的。顯然,在m>n的情況下,這樣的基底是可以構建出來的。
問題4:Cholesky 分解的原理是什么?
定義
如果矩陣A是一個對稱正定矩陣,那么 A = L L T A=LL^{T} A=LLT,其中L為一個上三角矩陣。
原理/自己的一些理解
由于矩陣A為一個對稱正定矩陣,可以把A拆分成如下形式
A = B T B A=B^{T}B A=BTB
其中B為一個滿秩矩陣,對B應用QR分解可得
A = B T B = ( Q R ) T ( Q R ) = R T Q T Q R = R T R A=B^{T}B=(QR)^{T}(QR)=R^{T}Q^{T}QR = R^{T}R A=BTB=(QR)T(QR)=RTQTQR=RTR
其中,R為上三角矩陣。
問題5:編程實現 A 為 100 × 100 隨機矩陣時,用 QR 和 Cholesky 分解求 x 的程序。你可以參考本次課用到的 useEigen 例程
源代碼
#include <iostream> #include <Eigen/Core> #include <Eigen/Dense> #include <Eigen/QR> #include <Eigen/Cholesky>using namespace std; int main() {Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A = Eigen::MatrixXd::Random(100,100);Eigen::Matrix<double, Eigen::Dynamic, 1>b = Eigen::MatrixXd::Random(100,1);A = A.transpose()*A; //保證A是半正定,這樣cholesky才有效Eigen::Matrix<double, Eigen::Dynamic, 1> x_QR = A.colPivHouseholderQr().solve(b);//QR分解的結果Eigen::Matrix<double, Eigen::Dynamic, 1> x_Cholesky = A.llt().solve(b);;//分解的結果std::cout << "QR result: " << x_QR.transpose() << std::endl;std::cout << "Cholesky result: " << x_Cholesky.transpose() << std::endl;std::cout << "QR ||Ax - b ||= " << (A*x_QR - b).norm() << std::endl;std::cout << "Cholesky ||Ax - b ||= " << (A*x_Cholesky - b).norm() << std::endl;return 0; }運行結果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-febudbTY-1645373936202)(https://pic.imgdb.cn/item/61fe44352ab3f51d918828a5.jpg)]
運行結果矩陣論基礎
問題1:什么是正定矩陣和半正定矩陣?
- 正定矩陣:對于任何 x > 0 x > 0 x>0 如果 x T A x > 0 x^{T}Ax>0 xTAx>0恒成立,那么A為正定矩陣
- 半正定矩陣:對于任何 x ≥ 0 x \geq 0 x≥0 如果 x T A x ≥ 0 x^{T}Ax\geq0 xTAx≥0恒成立,那么A為半正定矩陣
問題2:對于方陣 A,它的特征值是什么?特征向量是什么?特征值一定是實數嗎?如何計算一個矩陣的特征值?
方針A的特征值和特征向量
? 對于一個n階的矩陣A,存在一個實數[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vmyTtsY4-1645373936203)(https://www.zhihu.com/equation?tex=%5Clambda)],使得我們可以找到一個非零向量x,滿足:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-epRCezf8-1645373936203)(https://www.zhihu.com/equation?tex=Ax%3D%5Clambda+x+%5C%5C)]
? 如果能夠找到的話,我們就稱[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IoKoFaJD-1645373936204)(https://www.zhihu.com/equation?tex=%5Clambda)]是矩陣A的特征值,非零向量x是矩陣A的特征向量。
如何計算一個矩陣的特征值
對原式來進行一個很簡單的變形:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4htLqvIj-1645373936206)(https://www.zhihu.com/equation?tex=%28A-%5Clambda+I%29x+%3D+0+%5C%5C)]
在x不全為0的情況下,如果使得上述公式成立,需要 A ? λ I A-\lambda I A?λI奇異,即選擇一個合適的 λ \lambda λ使得行列式| A ? λ I A-\lambda I A?λI|為0即可。由求解方法可見,矩陣的特征值不一定為實數,只有當矩陣是實矩陣時,特征值才為實數。
問題3:什么是矩陣的相似性?相似性反映了什么幾何意義?
相似矩陣的定義:
? 對于矩陣 A A A和矩陣 B B B,如果存在一個満秩方陣S使得 A = S ? 1 B S A = S^{-1}BS A=S?1BS,那么矩陣 A A A和矩陣 B B B相似
相似性反映了什么幾何意義
? 線性變換若粗略看成一個剛體的特定運動。剛體的特定運動是同一個,但坐標系改變的話這個運動的描述函數就會不一樣,如果這個函數可用矩陣等價替代的話,一個坐標系就對應著一個矩陣,因此這些矩陣就不同,但這些矩陣必有關系,這個關系就是相似。
問題4:矩陣一定可以對角化嗎,什么樣的矩陣能夠保證對角化?不能對角化的矩陣能夠形成什么樣的形式(Jordan 標準型)?
矩陣不一定可以對角化,滿秩矩陣才可以對角化,不能對角化的矩陣可以化簡成Jordan 標準型,只有對角線及下方/上方相鄰元素有數據。
問題5:奇異值分解(SVD)是什么意思?
對于任何一個矩陣 A m ? n A_{m*n} Am?n?,可以將他分解成 A m ? n = U m ? m ∑ m ? n V n ? n A_{m*n} = U_{m*m}\sum_{m*n}V_{n*n} Am?n?=Um?m?∑m?n?Vn?n?,其中 U 、 V U、V U、V為正定矩陣, ∑ m ? n \sum_{m*n} ∑m?n?為對角矩陣。
問題6:矩陣的偽逆是什么意思(Pseudo inverse)?莫爾——彭多斯逆是如何定義的?怎么計算一個矩陣的偽逆?
矩陣偽逆
當一個矩陣 A m ? n A_{m*n} Am?n?是奇異矩陣的時候,無法求的矩陣的逆解,但是可以按照矩陣的三種形式,求得以下三種偽逆
- 當 m > n m>n m>n時,可以求得一個左逆矩陣使得 A L A = I A^{L}A = I ALA=I (存在多個)
- 當 m < n m < n m<n時,可以求得一個右逆矩陣使得 A A R = I AA^{R}=I AAR=I (存在多個)
- 當 m = n m=n m=n且A為奇異矩陣時,可以根據SVD分解求得偽逆 A = U D V T A = UDV^{T} A=UDVT,則A的偽逆為 A + = V D + U T A^+=VD^+U^T A+=VD+UT
莫爾——彭多斯逆
如果矩陣 B B B滿足以下四個條件,那么為們可以稱 B B B為 A A A的莫爾——彭多斯逆
- B A B = B BAB = B BAB=B
- A B A = A ABA = A ABA=A
- ( A B ) H = A B (AB)^H=AB (AB)H=AB
- ( B A ) H = B A (BA)^H=BA (BA)H=BA
莫爾——彭多斯逆可以通過SVD分解的方法進行計算
問題7:超定方程求解相關
對于超定方程: A x = b Ax = b Ax=b 且 A A A 不可逆時,我們通常計算最小二乘解: x = arg?max ? a ∣ ∣ A x ? b ∣ ∣ x = \operatorname{arg\,max}_a||Ax ? b|| x=argmaxa?∣∣Ax?b∣∣。線性方程的最小二乘解在代數意義上是可以解析地寫出來的。請回答以下小問題:
在 b ≠ 0 b \neq 0 b?=0 時, x x x 的解是什么形式?
當b不為0時,解的形式為 ( A T A ) ? 1 A T b (A^TA)^{-1}A^Tb (ATA)?1ATb
事實上,我們可以對 A A A 求奇異值或對于 A T A A^TA ATA 求特征值。請闡述兩者之間的關系
? 矩陣A的SVD分解為 A = U D V T A = UDV^{T} A=UDVT,其中D為對角矩陣(對角元素可能為0),進而可以計算出 A T A = U D V T V D U T = U D D U T A^TA=UDV^{T}VDU^T=UDDU^T ATA=UDVTVDUT=UDDUT
? 矩陣 A T A A^TA ATA的特征值可以表示為 A T A M = M ∑ A^TAM=M\sum ATAM=M∑其中 ∑ \sum ∑為特征值為對角線的對角矩陣,M為特征值對應的特征向量所組成的方陣,為單位正定矩陣。上式可進一步轉化為 A T A = M ∑ M T A^TA=M\sum M^T ATA=M∑MT
? 由此可以發現,在形式上當A為一個方陣時, D D = ∑ DD = \sum DD=∑。
當 b = 0 b = 0 b=0 時,我們希望求 x x x 的非零解。請說明如何求解 x x x
x x x為 A T A A^TA ATA最小特征值對應的特征向量,因為此時 ∣ ∣ A x ∣ ∣ = x T A T A x = λ m i n ||Ax|| = x^{T} A^{T} Ax= \lambda _{min} ∣∣Ax∣∣=xTATAx=λmin?
請談談你對上述解法在幾何意義上的理解。該問題為開放問題
設A為m行n列的一個矩陣,m>n。
-
理解1:可以理解為有m個在n+1維空間中的平面(傳統三維空間中存在的為而二維平面,矩陣A的每一行就代表一個平面),我們需要確定一個x,使得由x確定的每個平面上的點到原點的距離總和最小
-
理解2:矩陣A可以看作對向量x進行旋轉->縮放->升緯/降緯->旋轉的操作,為們需要確定一個最有的向量(x),使得這個向量在進行完上述一系列操作之后,模最小。
幾何運算練習
? 下面我們來練習如何使用 Eigen/Geometry 計算一個具體的例子。
? 一個機器人上通常會安裝許多不同的傳感器,而且這些傳感器之間還存在固連關系。我們舉一個典型的例子。
? 在世界系 W 下,存在一個運動的機器人 R。按照固定的或者某些開發人員或者領導的特殊喜好, R系定義在機器人腳部的位置。但是機器人在設計的時候,又定義了 B 系(Body 系,或本體系),位于機器人頭部的位置。由于溝通不暢,標定人員把一臺激光傳感器和一臺視覺傳感器標定在了 B 系下。我們稱激光傳感器為 L 系,視覺傳感器為 C 系。現在請你完成以下工作:
問題1:說明一個激光傳感器下的看到的點應該如何計算它的世界坐標。
問題2:給定以下數據,計算觀測點在激光坐標系和世界坐標系下的坐標
$ q_{WR}=[0.55, 0.3, 0.2, 0.2], t_{WR}=[0.1, 0.2, 0.3]^{T}, $
q R B = [ 0.99 , 0 , 0 , 0.01 ] , t R B = [ 0.05 , 0 , 0.5 ] T , q_{RB} = [0.99, 0, 0, 0.01], t_{RB} = [0.05, 0, 0.5]^{T}, qRB?=[0.99,0,0,0.01],tRB?=[0.05,0,0.5]T,
q B L = [ 0.3 , 0.5 , 0 , 20.1 ] , t B L = [ 0.4 , 0 , 0.5 ] T , q_{BL} = [0.3, 0.5, 0, 20.1], t_{BL} = [0.4, 0, 0.5]^T , qBL?=[0.3,0.5,0,20.1],tBL?=[0.4,0,0.5]T,
q B C = [ 0.8 , 0.2 , 0.1 , 0.1 ] , t B C = [ 0.5 , 0.1 , 0.5 ] T q_{BC} = [0.8, 0.2, 0.1, 0.1], t_{BC} = [0.5, 0.1, 0.5]^T qBC?=[0.8,0.2,0.1,0.1],tBC?=[0.5,0.1,0.5]T
p C = [ 0.3 , 0.2 , 1.2 ] T p_{C}=[0.3, 0.2,1.2]^{T} pC?=[0.3,0.2,1.2]T
源代碼
#include<Eigen/Core> #include<Eigen/Geometry> #include<iostream>int main(int argv, char** argc) {//初始化四元數Eigen::Quaterniond q_W2R(0.55, 0.3, 0.2, 0.2); //這種方式初始化,實部在前Eigen::Quaterniond q_R2B(0.99, 0, 0, 0.01);Eigen::Quaterniond q_B2L(0.3, 0.5, 0, 20.1);Eigen::Quaterniond q_B2C(0.8, 0.2, 0.1, 0.1);//四元數歸一化q_W2R.normalize();q_R2B.normalize();q_B2L.normalize();q_B2C.normalize();//初始化平移向量Eigen::Vector3d t_W2R(0.1, 0.2, 0.3);Eigen::Vector3d t_R2B(0.05, 0, 0.5);Eigen::Vector3d t_B2L(0.4, 0, 0.5);Eigen::Vector3d t_B2C(0.5, 0.1, 0.5);//相機坐標系下該點坐標Eigen::Vector3d p_C(0.3, 0.2,1.2);//四元數轉化為旋轉矩陣Eigen::Matrix3d R_W2R = q_W2R.matrix();Eigen::Matrix3d R_R2B = q_R2B.matrix();Eigen::Matrix3d R_B2L = q_B2L.matrix();Eigen::Matrix3d R_B2C = q_B2C.matrix();//計算激光坐標系下該點位置 C -> B -> LEigen::Vector3d p_B = R_B2C*p_C + t_B2C;Eigen::Vector3d p_L = R_B2L.transpose()*p_B - R_B2L.transpose()*t_B2L; //激光坐標系下該點位置//計算世界坐標系下該點位置 B -> R -> WEigen::Vector3d p_R = R_R2B*p_B + t_R2B;Eigen::Vector3d p_W = R_W2R*p_R + t_W2R; //世界坐標系下該點位置std::cout << "激光坐標系下該點位置:" << p_L.transpose() << std::endl;std::cout << "世界坐標系下該點位置" << p_W.transpose() << std::endl;return 0; }運行結果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1765vWza-1645373936207)(https://pic.imgdb.cn/item/61fd564b2ab3f51d91d11428.jpg)]
運行結果旋轉的表達
課程中提到了旋轉可以用旋轉矩陣、旋轉向量與四元數表達,其中旋轉矩陣與四元數是日常應用中常見的表達方式。請根據課件知識,完成下述內容的證明。
問題1:設有旋轉矩陣 R,證明 R T R = I R^TR = I RTR=I 且 d e t R = 1 det R = 1 detR=1
由旋轉矩陣的計算過程可知,當一個向量在通過R完成旋轉時,實際上是用這個向量與R的每一個行向量進行一次點積。也就是說,R的每一個行向量代表旋轉后坐標軸的方向,因此R的每一個行向量是一個單位向量且是相互正交的,因此 R T R = I R^TR = I RTR=I 且 d e t R = 1 det R = 1 detR=1
問題2:設有四元數 q,我們把虛部記為 ε,實部記為 η,那么 q = (ε, η)。請說明 ε 和 η 的維度。
四元數的實部為一維,虛部為三維,且整體的模為1
問題3:
羅德里格斯公式的證明
問題1:羅德里格斯公式證明
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hJwAfyfd-1645373936207)(https://pic.imgdb.cn/item/61ff86b92ab3f51d91a3e1e6.png)]
上圖中,向量V繞旋轉軸K旋轉 θ \theta θ到達 V r o t V_{rot} Vrot?
證明過程如下:
向量 V V V可分解為兩個向量: V / / 、 V ⊥ V_{//}、V_{⊥} V//?、V⊥?,其中 V / / V_{//} V//?為向量 V V V向向量 K K K的投影,即 V / / = ( V T K ) K 、 V ⊥ = V ? V / / V_{//}=(V^TK)K、V_⊥=V-V_{//} V//?=(VTK)K、V⊥?=V?V//?
向量 V V V的旋轉過程可進一步分解成 V / / 、 V ⊥ V_{//}、V_{⊥} V//?、V⊥?的旋轉,即 V r o t = V r o t ⊥ + V r o t / / V_{rot}=V_{rot_{⊥}}+V_{rot_{//}} Vrot?=Vrot⊥??+Vrot//??
由于 V / / V_{//} V//?和旋轉軸平行,因此旋轉前后保持不變,即 V r o t / / = V / / V_{rot_{//}}=V_{//} Vrot//??=V//?
V ⊥ V_{⊥} V⊥?旋轉后的向量可進一步分解成向量 a a a和向量 b b b如上圖所示,其中 b = c o s ( θ ) V ⊥ 、 a = s i n ( θ ) K × V b = cos(\theta)V_{⊥}、a=sin(\theta)K\times V b=cos(θ)V⊥?、a=sin(θ)K×V
綜上,
V r o t = V r o t ⊥ + V r o t / / = a + b + V / / = s i n ( θ ) K × V + c o s ( θ ) V ⊥ + ( V T K ) K = s i n ( θ ) K × V + c o s ( θ ) ( V ? ( V T K ) K ) + ( V T K ) K = s i n ( θ ) K × V + c o s ( θ ) V + ( 1 ? c o s ( θ ) ) ( V T K ) K = s i n ( θ ) K × V + c o s ( θ ) V + ( 1 ? c o s ( θ ) ) K K T V = ( s i n ( θ ) K Λ + c o s ( θ ) I + ( 1 ? c o s ( θ ) ) K K T ) V = R V V_{rot}\\=V_{rot_{⊥}}+V_{rot_{//}} \\ = a + b + V_{//} \\ = sin(\theta)K\times V + cos(\theta)V_{⊥} + (V^TK)K \\ = sin(\theta)K\times V + cos(\theta)(V-(V^TK)K) + (V^TK)K \\ = sin(\theta)K\times V + cos(\theta)V + (1 - cos(\theta))(V^TK)K \\ = sin(\theta)K\times V + cos(\theta)V + (1 - cos(\theta))KK^{T}V \\ = (sin(\theta)K^{\Lambda} + cos(\theta)I + (1 - cos(\theta))KK^{T})V \\ = RV Vrot?=Vrot⊥??+Vrot//??=a+b+V//?=sin(θ)K×V+cos(θ)V⊥?+(VTK)K=sin(θ)K×V+cos(θ)(V?(VTK)K)+(VTK)K=sin(θ)K×V+cos(θ)V+(1?cos(θ))(VTK)K=sin(θ)K×V+cos(θ)V+(1?cos(θ))KKTV=(sin(θ)KΛ+cos(θ)I+(1?cos(θ))KKT)V=RV
因此, s i n ( θ ) K Λ + c o s ( θ ) I + ( 1 ? c o s ( θ ) ) K K T = R sin(\theta)K^{\Lambda} + cos(\theta)I + (1 - cos(\theta))KK^{T} = R sin(θ)KΛ+cos(θ)I+(1?cos(θ))KKT=R
問題2:試用此式證明 R T = R ? 1 R^T = R^{-1} RT=R?1
由定義可知, R ? 1 R^{-1} R?1對應的旋轉軸與 R R R對應的旋轉軸應該相同,只是 θ \theta θ相反
R T = ? s i n ( θ ) K Λ + c o s ( θ ) I + ( 1 ? c o s ( θ ) ) K K T = s i n ( ? θ ) K Λ + c o s ( θ ) I + ( 1 ? c o s ( θ ) ) K K T R^T = -sin(\theta)K^{\Lambda} + cos(\theta)I + (1 - cos(\theta))KK^{T} = sin(-\theta)K^{\Lambda} + cos(\theta)I + (1 - cos(\theta))KK^{T} RT=?sin(θ)KΛ+cos(θ)I+(1?cos(θ))KKT=sin(?θ)KΛ+cos(θ)I+(1?cos(θ))KKT
由上式可以看出 , R T R^T RT與 R R R的形式相對比,確實也只有 θ \theta θ相反,因此 R T = R ? 1 R^T = R^{-1} RT=R?1,證畢。
四元數運算性質的驗證
問題1:驗證旋轉后的四元數為虛四元數
p ′ = q p q ? 1 = q + p + q ? 1 = q + p ? 1 ⊕ p p' = qpq^{-1}=q^+p^+q^{-1}=q^+p^{-1⊕}p p′=qpq?1=q+p+q?1=q+p?1⊕p
參考鏈接
線性代數精華——矩陣的特征值與特征向量
相似矩陣的幾何意義是什么
偽逆矩陣(廣義逆矩陣)
羅德里格斯公式證明
總結
以上是生活随笔為你收集整理的深蓝学院-视觉SLAM理论与实践-第十二期-第2章作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于绿色建筑的发展促进,从技术厂家角度我
- 下一篇: OpenHarmony恢复启动子系统in