目录
第二节课习题
2. 熟悉Eigen矩阵运算
设线性方程Ax = b,在A 为方阵的前提下,请回答以下问题:
-
在什么条件下,x 有解且唯一?
方阵A满秩,且系数矩阵A的秩和增广矩阵 A ˉ \bar A Aˉ的秩相等,即 r ( A ) = r ( A ˉ ) = n r(A) = r(\bar A) = n r(A)=r(Aˉ)=n .
-
高斯消元法的原理是什么?
通过初等行变换将增广矩阵转化为行阶梯型矩阵,最后再将得到的行阶梯型矩阵还原为线性方程组求出原方程组的解。从下边的例子可以看出方程组中每个方程含有的未知数的个数降到最低,并且最下面的方程含有的未知数的个数最少。
例:利用高斯消元法求解方程组 { x 1 + x 2 + x 3 = 3 x 1 + 2 x 2 + 4 x 3 = 7 x 1 + 3 x 2 + 9 x 3 = 13 \begin{cases} x_1 + x_2 + x_3 = 3 \, \\ x_1 + 2x_2 + 4x_3 = 7 \, \\ x_1 + 3x_2 + 9x_3 = 13 \end{cases} ⎩ ⎨ ⎧x1+x2+x3=3x1+2x2+4x3=7x1+3x2+9x3=13 。
解:对增广矩阵作如下变换:
[ 1 1 1 3 1 2 4 7 1 3 9 13 ] ⟶ [ 1 1 1 3 0 1 3 4 0 2 8 10 ] ⟶ [ 1 1 1 3 0 1 3 4 0 1 4 5 ] ⟶ [ 1 1 1 3 0 1 3 4 0 0 1 1 ] \begin{bmatrix} 1&1&1&3\\ 1&2&4&7\\ 1&3&9&13\\ \end{bmatrix} \longrightarrow \begin{bmatrix} 1&1&1&3\\ 0&1&3&4\\ 0&2&8&10\\ \end{bmatrix} \longrightarrow \begin{bmatrix} 1&1&1&3\\ 0&1&3&4\\ 0&1&4&5\\ \end{bmatrix} \longrightarrow \begin{bmatrix} 1&1&1&3\\ 0&1&3&4\\ 0&0&1&1\\ \end{bmatrix} ⎣ ⎡1111231493713⎦ ⎤⟶⎣ ⎡1001121383410⎦ ⎤⟶⎣ ⎡100111134345⎦ ⎤⟶⎣ ⎡100110131341⎦ ⎤
进行回代操作:
{ x 1 + x 2 + x 3 = 3 x 2 + 3 x 3 = 4 x 3 = 1 \begin{cases} x_1 + x_2 + x_3 = 3 \, \\ x_2 + 3x_3 = 4 \, \\ x_3 = 1 \end{cases} ⎩ ⎨ ⎧x1+x2+x3=3x2+3x3=4x3=1
最后得到原线性方程组的解为 { x 1 = 1 x 2 = 1 x 3 = 1 \begin{cases} x_1 = 1 \, \\ x_2 = 1 \, \\ x_3 = 1 \end{cases} ⎩ ⎨ ⎧x1=1x2=1x3=1 -
Q R \bf{QR} QR 分解的原理是什么?
参考资料:https://blog.csdn.net/u010945683/article/details/45972819
https://zhuanlan.zhihu.com/p/84415000
首先,QR分解的定义:
一个矩阵 A ∈ R m × n , m ≥ n 可以被分解成 A = Q R , 其中 : A \in \mathbb{R}^{m \times n}, m\geq n可以被分解成A = QR,其中: A∈Rm×n,m≥n可以被分解成A=QR,其中:
- Q ∈ R m × n 是正交矩阵 Q \in \mathbb{R}^{m \times n}是正交矩阵 Q∈Rm×n是正交矩阵
- R ≡ [ R ^ 0 ] ∈ R m × n R \equiv \begin{bmatrix} \widehat{R}\\ 0\\ \end{bmatrix} \in \mathbb{R}^{m \times n} R≡[R 0]∈Rm×n
- R ^ ∈ R m × n \widehat{R}\in \mathbb{R}^{m \times n} R ∈Rm×n是上三角矩阵
计算QR分解一共有三种方法:
- Gram-Schmidt Orthogonalization (也就是常说的施密特正交化)
- Householder Triangularization
- Givens Rotations
QR分解原理:
QR矩阵分解,就是将任意一个满秩矩阵可以分解成一个列向量正交矩阵 Q Q Q与一个上三角矩阵 R R R的积,即 A = Q R A = QR A=QR。以施密特正交化方法为例,原理是利用正交投影的思想,将矩阵每个列作为一个基本单元,将其转化为正交的基向量与在这个基向量上的投影长度的积。这一过程的具体介绍可参考https://blog.csdn.net/u010945683/article/details/45972819,讲的非常详细。
-
Cholesky 分解的原理是什么?
Cholesky分解定理:
若 A ∈ R n × n A\in R^{n\times n} A∈Rn×n是对称正定矩阵,则存在一个对角元均为正数的下三角矩阵 L ∈ R n × n L \in R^{n\times n} L∈Rn×n,使得
A = L L T A = LL^{T} A=LLTCholesky 分解是将一个实对称正定矩阵分解成一个下三角矩阵与其共轭转置的乘积。
-
编程实现 A A A 为 100 × 100 100 × 100 100×100 随机矩阵时,用 Q R \bf{QR} QR 和Cholesky 分解求 x x x 的程序。你可以参考本次课
用到的useEigen 例程。代码说明:
若使用Cholesky分解,矩阵需要满足为正定矩阵,也就是
A = L L T A = LL^{T} A=LLT
所以先随机化生成一个矩阵Random_Matrix,并根据此矩阵来获得矩阵 A A A。核心代码:
int main( int argc, char** argv ) { //构造动态矩阵, 类型为double型 MatrixXd Random_Matrix = MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE ); MatrixXd A = Random_Matrix * Random_Matrix.transpose() ; //使得A为正定对称矩阵,才能使得Cholesky分解成功 VectorXd B = VectorXd::Random( MATRIX_SIZE ); VectorXd x = A.colPivHouseholderQr().solve(B); //调用QR分解求解 cout <<"调用QR分解求得Ax=b方程的解为\n"<< x << endl; VectorXd y = A.llt().solve(B); //调用Cholesky分解求解 cout <<"调用cholesky分解求得Ax=b方程的解为\n"<< y << endl; return 0; }
3.矩阵论基础
-
什么是正定矩阵和半正定矩阵?
参考博客:https://zhuanlan.zhihu.com/p/44860862
在学习矩阵论或者线性代数等数学课程时,我们都会学习到正定矩阵和半正定矩阵的知识。半正定矩阵的定义其实是包括正定矩阵的。在不考虑由复数构成的矩阵的话,正定矩阵和半正定矩阵的定义是很简单的:
**正定矩阵:**给定一个大小为 n × n n \times n n×n的实对称矩阵A,若对于任意长度为 n n n的非零向量 x x x,有 x T A x > 0 x^{T}Ax>0 xTAx>0恒成立,则矩阵 A A A是一个正定矩阵。
**半正定矩阵:**给定一个大小为 n × n n \times n n×n的实对称矩阵A,若对于任意长度为 n n n的向量 x x x,有 x T A x ≥ 0 x^{T}Ax \geq 0 xTAx≥0恒成立,则矩阵 A A A是一个正定矩阵。
-
对于方阵A,它的特征值是什么?特征向量是什么?特征值一定是实数吗?如何计算一个矩阵的
特征值?参考资料:
- https://zhuanlan.zhihu.com/p/104980382
- https://zhuanlan.zhihu.com/p/95836870
对于做算法的人来说,相比于使用code来计算矩阵的特征值和特征向量,深入理解这两个概念和几何意义更为重要。因为在机器学习领域经常会用到这两者进行降维处理。矩阵的特征值和特征向量的定义如下:
假设我们有一个n阶的矩阵 A A A以及一个实数 λ \lambda λ,使得我们可以找到一个非零向量 x x x,满足:
A x = λ x Ax = \lambda x Ax=λx
如果能找到这样的值的话,我们就称 λ \lambda λ是矩阵 A A A的特征值,非零向量 x x x是矩阵的特征向量。 **几何意义:**单从定义来看很难直观的理解这两个概念,下面我将结合矩阵变换的几何意义来介绍这两个概念。对于一个n维的向量 x x x来说,如果我们给它乘上一个n阶的方阵 A A A,得到 A x Ax Ax。从几何角度来说,是对向量 x x x进行了一个线性变换。变换之后得到的向量 y y y(也就是 A x Ax Ax)和原向量 x x x的方向和长度都发生了改变。
但对于一个特定的矩阵 A A A来说,总存在一些特定方向的向量x,使得Ax和x的方向没有发生变化,只是长度发生了变化。我们令这个长度发生的变化当做是系数 λ \lambda λ,那么对于这样的向量 x x x就称为是矩阵 A A A的特征向量, λ \lambda λ就是这个特征向量对应的特殊值,也就是矩阵 A A A的特征值。
以上图中经过错切变换的蒙娜丽莎为例,可以将蒙娜丽莎原图简化成一个
2
×
2
2\times2
2×2的方阵,经过变换这幅图在水平方向上的相对位置是没有改变的(比如俩眼睛之间的距离没变化吧),
[
1
0
]
\begin{bmatrix} 1\\ 0\\ \end{bmatrix}
[10]就是它的一个特征向量,对应的特征值
λ
\lambda
λ为1。
特征值一定是实数吗?
实矩阵的特征值不一定都是实数,只有实对称矩阵的特征值才保证是实数。另外复矩阵的特征值也可能有实数。
计算矩阵的特征值
由定义可做如下变形:
A
x
=
λ
x
⟶
(
x
−
λ
I
)
x
=
0
Ax = \lambda x \longrightarrow (x -\lambda I) x=0
Ax=λx⟶(x−λI)x=0
如果 上述式子有非零解,那么
A
−
λ
I
A-\lambda I
A−λI是奇异的,也就是行列式为零。因此我们可以通过下式求出特征值:
d
e
t
(
A
−
λ
I
)
=
0
det(A-\lambda I) = 0
det(A−λI)=0
然后,针对每个特征值,再通过求解
(
A
−
λ
I
)
x
=
0
(A-\lambda I)x=0
(A−λI)x=0 来找到特征向量。
-
什么是矩阵的相似性?相似性反映了什么几何意义?
相似矩阵定义:
设 A , B A,B A,B为 n n n阶矩阵,如果有 n n n阶可逆矩阵 P P P存在,使得
P − 1 A P = B P^{-1}AP = B P−1AP=B
则称矩阵 A A A与 B B B相似,记为 A ∼ B A \sim B A∼B。这里推荐先看一下这篇解说就更容易理解下边这句话了:https://zhuanlan.zhihu.com/p/151231495
相似矩阵的本质就是,相似的矩阵是同一个线性变换在不同基/坐标系下的的不同描述。同一个运动过程(线性变换)在不同坐标系(不同基)中的表示矩阵(相似矩阵)虽然不一样,但实质上是指的同一个线性变换。
从机器人坐标变换的角度探究相似矩阵的几何意义:
-
坐标和变换的定义:
三维空间中某一点的位置在坐标系 O X 0 Y 0 Z 0 OX_0Y_0Z_0 OX0Y0Z0和坐标系 O X 1 Y 1 Z 1 OX_1Y_1Z_1 OX1Y1Z1中的坐标分别是 P 0 P^{0} P0和 P 1 P^{1} P1,从坐标系 O X 0 Y 0 Z 0 OX_0Y_0Z_0 OX0Y0Z0和坐标系 O X 1 Y 1 Z 1 OX_1Y_1Z_1 OX1Y1Z1的旋转变换为 R = R 10 R = R_{10} R=R10
通过某一旋转变换,该点到达新的位置,点的坐标在坐标系 O X 0 Y 0 Z 0 OX_0Y_0Z_0 OX0Y0Z0和坐标系 O X 1 Y 1 Z 1 OX_1Y_1Z_1 OX1Y1Z1中分别为 p ′ 0 p^{'0} p′0和 p ′ 1 p^{'1} p′1。该旋转变换,在两个坐标系下分别为A和B。
-
坐标变换关系
P ′ 0 = A P 0 P ′ 1 = B P 1 P 0 = R 01 P 1 P ′ 0 = R 01 P ′ 1 P^{'0} = AP^{0} \\ P^{'1} = BP^{1}\\ P^{0} = R_{01} P^{1}\\ P^{'0} = R_{01} P^{'1} P′0=AP0P′1=BP1P0=R01P1P′0=R01P′1 -
推导
P ′ 1 = B P 1 ( R 01 ) − 1 P ′ 0 = B ( R 01 ) − 1 P 0 ( R 01 ) − 1 A P 0 = B ( R 01 ) − 1 P 0 ( R 01 ) − 1 A = B ( R 01 ) − 1 ( R 01 ) − 1 A R 01 = B P^{'1} = BP^{1}\\ (R_{01})^{-1}P^{'0} = B(R_{01})^{-1}P^{0} \\ (R_{01})^{-1}AP^{0} = B(R_{01})^{-1}P^{0} \\ (R_{01})^{-1}A = B(R_{01})^{-1}\\ (R_{01})^{-1}A R_{01} = B P′1=BP1(R01)−1P′0=B(R01)−1P0(R01)−1AP0=B(R01)−1P0(R01)−1A=B(R01)−1(R01)−1AR01=B -
结论
B = R − 1 A R B = R^{-1}AR B=R−1AR
其中 R R R为从坐标系 O X 0 Y 0 Z 0 OX_0Y_0Z_0 OX0Y0Z0到坐标系 O X 1 Y 1 Z 1 OX_1Y_1Z_1 OX1Y1Z1的旋转变换。
这块在网上搜到了下边这篇文章,从定义到推导,简单明了的说明了在机器人坐标变换角度中矩阵相似的几何意义。https://blog.csdn.net/zhpfeng10/article/details/108977526
-
-
矩阵一定能对角化吗?什么样的矩阵能保证对角化?不能对角化的矩阵能够形成什么样的形式(Jordan
标准形)?定义:对角矩阵是指只有主对角线上含有非零元素的矩阵,即,已知一个 n × n n \times n n×n矩阵 M M M,如果对于 i ≠ j , M i j = 0 i\neq j,M_{ij}=0 i=j,Mij=0,则该矩阵为对角矩阵。
如果存在一个矩阵 A A A,使 A − 1 M A A^{-1}MA A−1MA的结果为对角矩阵,则称矩阵 A A A将矩阵 M M M对角化。
对于一个矩阵来说,不一定存在将其对角化的矩,但是任意一个 n × n n\times n n×n矩阵如果存在 n n n个线性不相关的特征向量,则该矩阵可被对角化。具体原因在这篇文章中说的很明白: https://www.zhihu.com/question/323578684/answer/753474442
若实在不能对角化,可化成Jordan标准型
J o d a n Jodan Jodan型矩阵:为上双对角矩阵,其上对角线的元素为1或0。这种标准型总能够实现,但不一定数值稳定。该标准型是一组“几乎对角的”矩阵。具体形式参考《矩阵分析与应用》张贤达这本书p237页。
-
奇异值分解(SVD)是什么意思?
定义:
S V D SVD SVD的基本公式:
A = U Σ V T A = U \Sigma V^{T} A=UΣVT
其中, A ∈ R m ∗ n , U ∈ R m ∗ n , Σ ∈ R m ∗ n A \in \mathbb{R}^{m*n}, U \in \mathbb{R}^{m*n}, \Sigma \in \mathbb{R}^{m*n} A∈Rm∗n,U∈Rm∗n,Σ∈Rm∗n且除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,且已按大小排好序, V ∈ R n ∗ n V \in \mathbb{R}^{n*n} V∈Rn∗n。其中, U U U的列向量即是 A A T AA^T AAT的特征向量,一般我们将 U U U中的每个特征向量叫做 A A A的左奇异向量; V V V的列向量即是 A T A A^TA ATA的特征向量,一般我们将 V V V中的每个特征向量叫做 A A A的右奇异值。
上图可以很形象的看出上面 S V D SVD SVD的定义。
-
矩阵的伪逆是什么意思(Pseudo inverse)?莫尔——彭多斯逆是如何定义的?怎么计算一个矩阵的
伪逆? 伪逆矩阵是逆矩阵的广义形式,由于奇异矩阵或者非方阵的矩阵不存在逆矩阵,但可以有伪逆矩阵(或者说是广义逆矩阵)。
满足 A L A = E A^LA = E ALA=E,但不满足 A A L = E AA^L=E AAL=E的矩阵 A L A^L AL称为矩阵 A A A的左逆矩阵。同理,满足 A A R = E AA^R = E AAR=E,但不满足 A R A = E A^RA=E ARA=E的矩阵 A R A^R AR称为矩阵 A A A的左逆矩阵。仅当 m ≥ n m\geq n m≥n时,列满秩,矩阵 A m × n A_{m\times n} Am×n有左逆矩阵, A L = ( A T A ) − 1 A T A^L = (A^T A)^{-1}A^T AL=(ATA)−1AT;仅当 m ≤ n m\leq n m≤n时,行满秩,矩阵 A m × n A_{m\times n} Am×n有右逆矩阵, A R = A T ( A T A ) − 1 A^R = A^T(A^T A)^{-1} AR=AT(ATA)−1;当 m = n , A m × n m=n, A_{m\times n} m=n,Am×n的秩为 r ≤ m = n r\leq m=n r≤m=n,对 A A A进行奇异值分解 A = U Σ V T A=U\Sigma V^T A=UΣVT, A A A的伪逆矩阵为 A + = V Σ + U T A^+ = V\Sigma^{+}U^T A+=VΣ+UT
莫尔-彭多斯逆(Moore-Penrose广义逆矩阵)
设 A ∈ C m × n ,如果 A \in C^{m \times n},如果 A∈Cm×n,如果 $ G \in C^{n \times m}$满足,
( 1 ) . A G A = A , ( 2 ) . G A G = G , ( 3 ) . ( A G ) H = A G , ( 4 ) . ( G A ) H = G A . \begin{aligned} &(1). \, AGA = A \space ,\\ &(2). \, GAG = G \space ,\\ &(3). \, (AG)^H = AG \space ,\\ &(4). \, (GA)^H = GA \space .\\ \end{aligned} (1).AGA=A ,(2).GAG=G ,(3).(AG)H=AG ,(4).(GA)H=GA .
则 G G G为 A A A的 M o o r e − P e n r o s e Moore-Penrose Moore−Penrose广义逆矩阵。( A T A^T AT为 A A A的转置共轭矩阵)计算矩阵的伪逆
算法核心步骤主要有两步:
- 计算矩阵 A m × n A_{m \times n} Am×n的满秩分解 A = F G A = FG A=FG。
- 求广义逆矩阵,也就是矩阵的伪逆 A − = G T ( F T A G T ) − 1 F T A^- = G^T(F^T A G^T)^{-1}F^T A−=GT(FTAGT)−1FT。
更具体计算递推公式在《矩阵分析与应用》张贤达这本书中p95页有详细的介绍。
对于Moore-Penrose逆矩阵的计算方法有两种,这里就不详细说明了,在《矩阵分析与应用》张贤达这本书中p106有完整介绍。
-
a)当 b ≠ 0 b \neq 0 b=0时,也即是求解非齐次线性方程组,有下面三种情况:
- 如果增广矩阵的阶梯型出现 0=常数,则方程组无解;
- 如果非零行个数r<方程组未知数的个数n,则方程组有无穷多个解
- 如果非零行个数r=方程组未知量的个数n,则方程组有唯一解,解就是化简的增广矩阵最后一列。
b)当 b = 0 b=0 b=0 时,我们希望求 x x x 的非零解。请说明如何求解 x x x
当( r < n r<n r<n),原方程有非零解,然后将系数矩阵 A A A化为行最简形矩阵,并写出同解方程组;
选取合适的未知自由量,并取出相应的基本向量组,代入同解方程组,得到原方程组的基础解系,进而写出通解。
特征值和奇异值的关系:对于非奇异矩阵进行奇异值分解(SVD),得到的奇异值其实就是特征值。对于奇异矩阵,就需要进行奇异值分解,对应奇异值。对于奇异矩阵,将 A T A A^T A ATA得到一个方阵,再求特征值。
c)上述解法的几何意义
之前曾经了解过,齐次线性方程的非零解求解可以用来判断三点是否在同一直线上,或者三点是否均经过某一点的判断。脑子不好使,具体的几何意义我还不能抽象的想象出来。
4. 几何运算练习
-
说明一个激光传感器下的看到的点应该如何计算它的世界坐标。
计算如下公式可得它的世界坐标系,其中,
- p L p_{L} pL表示该点在激光传感器坐标系下的坐标;
- T B , L T_{B,L} TB,L表示激光传感器坐标系到Body系的转换关系;
- T R , B T_{R,B} TR,B表示Body坐标系到定义在机器人脚部的R系的转换关系;
- T W , R T_{W,R} TW,R表示机器人脚部的R系到世界坐标系的转换关系;
p W = T W , R T R , B T B , L p L p_{W} = T_{W,R} \space T_{R,B} \space T_{B,L} \space p_{L} pW=TW,R TR,B TB,L pL
-
相机传感器观察到自身坐标系下的点 p C p_{C} pC [0.3, 0.2, 1.2],请计算某一点的激光系下的坐标和世界系下的坐标;
a) 激光系下的坐标,根据下列公式求解:
p B = T B , C p C p B = T B , L p L p L = ( T B , L ) − 1 T B , C p C p_{B} = T_{B,C} \space p_{C} \\ p_{B} = T_{B,L} \space p_{L} \\ p_{L} = (T_{B,L})^{-1} \space T_{B,C} \space p_{C} pB=TB,C pCpB=TB,L pLpL=(TB,L)−1 TB,C pC
坐标点为:[0.35, 1.2, -0.02]b) 世界系下的坐标,根据下列公式求解:
p W = T W , R T R , B T B , C p C p_{W} = T_{W,R} \space T_{R,B} \space T_{B,C} \space p_{C} pW=TW,R TR,B TB,C pC
坐标点为:[2.38, -0.13, 0.87]代码运行结果截图:
具体代码可查看相关代码文件。
5. 旋转的表达
1.设有旋转矩阵 R R R,证明 R T R = I R^TR=I RTR=I 且 d e t R = + 1 detR = +1 detR=+1。
证明:根据《视觉SLAM十四讲》p44页公式
[
e
1
,
e
2
,
e
3
]
[
a
1
a
2
a
3
]
=
[
e
1
′
,
e
2
′
,
e
3
′
]
[
a
1
′
a
2
′
a
3
′
]
\begin{bmatrix} e_1,e_2,e_3\\ \end{bmatrix} \begin{bmatrix} a_1\\ a_2\\ a_3 \end{bmatrix}= \begin{bmatrix} e_1^{'},e_2^{'},e_3^{'}\\ \end{bmatrix} \begin{bmatrix} a_1^{'}\\ a_2^{'}\\ a_3^{'} \end{bmatrix}
[e1,e2,e3]⎣
⎡a1a2a3⎦
⎤=[e1′,e2′,e3′]⎣
⎡a1′a2′a3′⎦
⎤
两边同时左乘
[
e
1
T
e
2
T
e
3
T
]
\begin{bmatrix}e_1^{T}\\e_2^{T}\\e_3^{T}\\\end{bmatrix}
⎣
⎡e1Te2Te3T⎦
⎤得:
[
a
1
a
2
a
3
]
=
R
a
′
=
[
e
1
T
e
1
′
,
e
1
T
e
2
′
,
e
1
T
e
3
′
e
2
T
e
1
′
,
e
2
T
e
2
′
,
e
2
T
e
3
′
e
3
T
e
1
′
,
e
3
T
e
2
′
,
e
3
T
e
3
′
]
[
a
1
′
a
2
′
a
3
′
]
(1)
\begin{bmatrix} a_1\\ a_2\\ a_3 \end{bmatrix}= Ra^{'}= \begin{bmatrix} e_1^{T}e_1^{'},\space e_1^{T}e_2^{'},\space e_1^{T}e_3^{'}\\ e_2^{T}e_1^{'},\space e_2^{T}e_2^{'},\space e_2^{T}e_3^{'}\\ e_3^{T}e_1^{'},\space e_3^{T}e_2^{'},\space e_3^{T}e_3^{'}\\ \end{bmatrix} \begin{bmatrix} a_1^{'}\\ a_2^{'}\\ a_3^{'} \end{bmatrix} \tag{1}
⎣
⎡a1a2a3⎦
⎤=Ra′=⎣
⎡e1Te1′, e1Te2′, e1Te3′e2Te1′, e2Te2′, e2Te3′e3Te1′, e3Te2′, e3Te3′⎦
⎤⎣
⎡a1′a2′a3′⎦
⎤(1)
两边同时左乘
[
(
e
1
′
)
T
(
e
2
′
)
T
(
e
3
′
)
T
]
\begin{bmatrix}(e_1^{'})^{T}\\(e_2^{'})^{T}\\(e_3^{'})^{T}\\\end{bmatrix}
⎣
⎡(e1′)T(e2′)T(e3′)T⎦
⎤得:
R
−
1
[
a
1
a
2
a
3
]
=
a
′
=
[
e
1
T
e
1
′
,
e
2
T
e
1
′
,
e
3
T
e
1
′
e
1
T
e
2
′
,
e
2
T
e
2
′
,
e
3
T
e
2
′
e
1
T
e
3
′
,
e
2
T
e
3
′
,
e
3
T
e
3
′
]
[
a
1
′
a
2
′
a
3
′
]
(2)
R^{-1} \begin{bmatrix} a_1\\ a_2\\ a_3 \end{bmatrix}= a^{'}= \begin{bmatrix} e_1^{T}e_1^{'},& e_2^{T}e_1^{'}, & e_3^{T}e_1^{'}& \\ e_1^{T}e_2^{'},& e_2^{T}e_2^{'},& e_3^{T}e_2^{'}\\ e_1^{T}e_3^{'},& e_2^{T}e_3^{'},& e_3^{T}e_3^{'}\\ \end{bmatrix} \begin{bmatrix} a_1^{'}\\ a_2^{'}\\ a_3^{'} \end{bmatrix} \tag{2}
R−1⎣
⎡a1a2a3⎦
⎤=a′=⎣
⎡e1Te1′,e1Te2′,e1Te3′,e2Te1′,e2Te2′,e2Te3′,e3Te1′e3Te2′e3Te3′⎦
⎤⎣
⎡a1′a2′a3′⎦
⎤(2)
由以上式1和式2可以看出
R
−
1
=
R
T
R^{-1}=R^T
R−1=RT
所以 R ⋅ R T = R ⋅ R − 1 = E R \cdot R^T = R\cdot R^{-1}=E R⋅RT=R⋅R−1=E得证 。
证明 d e t ( R ) = + 1 det(R)=+1 det(R)=+1
旋转矩阵 R R R把n维空间的一组标准化正交基转化为另一组标准正交基,这两组标准正交基分别用矩阵 I I I, I ′ I^{'} I′来表示,
所以, R I = I ′ RI = I^{'} RI=I′, 因为 d e t ( I ) = 1 , d e t ( I ′ ) = 1 det(I) = 1, \space det(I^{'})=1 det(I)=1, det(I′)=1
所以, d e t ( R ) = 1 det(R)=1 det(R)=1得证。
-
设有四元数 q q q,我们把虚部记为 ε \varepsilon ε,实部记为η,那么q = (ε, η)。请说明ε 和η 的维度。
一个四元数 q q q拥有一个实部和三个虚部,由三个虚部来表示三维的旋转。所以 ε \varepsilon ε是三维的,实部 η \eta η是一维的。
- 证明对任意单位四元数
q
1
,
q
2
q_1,q_2
q1,q2,四元数乘法可以写成矩阵乘法
q + = [ η I + ε × ε − ε T η ] , q ⨁ = [ η I − ε × ε − ε T η ] , q^{+}= \begin{bmatrix} \eta I+ \varepsilon^{\times} & \varepsilon \\ -\varepsilon^T & \eta \\ \end{bmatrix}, q^{\bigoplus}= \begin{bmatrix} \eta I - \varepsilon^{\times} & \varepsilon \\ -\varepsilon^T & \eta \\ \end{bmatrix}, q+=[ηI+ε×−εTεη],q⨁=[ηI−ε×−εTεη],
两个四元数 q 1 , q 2 q_1,q_2 q1,q2,它们的向量表示为 [ ε 1 , η 1 ] T , [ ε 2 , η 2 ] T [\varepsilon_1, \eta_1]^T,[\varepsilon_2, \eta_2]^T [ε1,η1]T,[ε2,η2]T,其原始四元数表示为:
q 1 = x 1 i + y 1 j + z 1 k + η 1 q 2 = x 2 i + y 2 j + z 2 k + η 2 q_1 = x_1i+y_1j+z_1k+ \eta_1 \\ q_2 = x_2i+y_2j+z_2k+ \eta_2 q1=x1i+y1j+z1k+η1q2=x2i+y2j+z2k+η2
q 1 q_1 q1与 q 2 q_2 q2相乘,整理可得,
q 1 q 2 = η 1 η 2 − x 1 x 2 − y 1 y 2 − z 1 z 2 + ( η 1 x 2 + x 1 η 2 + y 1 z 2 − z 1 y 2 ) i + ( η 1 y 2 − x 1 z 2 + y 1 η 2 + z 1 x 2 ) j + ( η 1 z 2 + x 1 y 2 − y 1 x 2 + z 1 η 2 ) k q_1q_2 = \eta_1\eta_2-x_1x_2-y_1y_2-z_1z_2 + (\eta_1x_2+x_1\eta_2+y_1z_2-z_1y_2)i \\ +(\eta_1y_2-x_1z_2+y_1\eta_2+z_1x_2)j +(\eta_1z_2+x_1y_2-y_1x_2+z_1\eta_2)k q1q2=η1η2−x1x2−y1y2−z1z2+(η1x2+x1η2+y1z2−z1y2)i+(η1y2−x1z2+y1η2+z1x2)j+(η1z2+x1y2−y1x2+z1η2)k
将上式写成向量形式并利用内外积运算,该表达式为:
q 1 q 2 = [ η 1 ε 2 + ε 1 η 2 + ε 1 × ε 2 η 1 η 2 − ε 1 T ε 2 ] q_1q_2 = \begin{bmatrix} \eta_1\varepsilon_2+\varepsilon_1\eta_2+\varepsilon_1 \times \varepsilon_2 \\ \eta_1\eta_2-\varepsilon^T_{1}\varepsilon_2 \\ \end{bmatrix} q1q2=[η1ε2+ε1η2+ε1×ε2η1η2−ε1Tε2]
四元数乘法写成矩阵形式:
q 1 + q 2 = [ η 1 I + ε 1 × ε 1 − ε 1 T η 1 ] [ ε 2 η 2 ] = [ η 1 ε 2 + ε 1 η 2 + ε 1 × ε 2 η 1 η 2 − ε 1 T ε 2 ] = q 1 q 2 q_1^{+}q_2 = \begin{bmatrix} \eta_1 I+ \varepsilon_1^{\times} &\varepsilon_1 \\ -\varepsilon_1^T & \eta_1 \\ \end{bmatrix} \begin{bmatrix} \varepsilon_2\\ \eta_2 \\ \end{bmatrix} = \begin{bmatrix} \eta_1\varepsilon_2+\varepsilon_1\eta_2+\varepsilon_1^{\times} \varepsilon_2 \\ \eta_1\eta_2-\varepsilon^T_{1}\varepsilon_2 \\ \end{bmatrix} =q_1q_2 q1+q2=[η1I+ε1×−ε1Tε1η1][ε2η2]=[η1ε2+ε1η2+ε1×ε2η1η2−ε1Tε2]=q1q2
同理可以证明:
q 1 q 2 = q 2 ⨁ q 1 q_1q_2 = q_2^{\bigoplus} q_1 q1q2=q2⨁q1
- 证明对任意单位四元数
q
1
,
q
2
q_1,q_2
q1,q2,四元数乘法可以写成矩阵乘法
6. 罗德里格斯公式的证明
由于数学功底有限,所以参考了很多材料,最后经过整理,自我消化,然后按照我的理解在下边记录该公式的推导过程。
- https://zhuanlan.zhihu.com/p/79061355
- https://blog.csdn.net/SKANK911/article/details/90056646
- https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
罗德里格斯公式描述了从旋转向量到旋转矩阵的转换关系。设旋转向量长度为
θ
\theta
θ,方向为
n
n
n,那么旋
转矩阵
R
R
R 为:
R
=
cos
θ
I
+
(
1
−
cos
θ
)
n
n
T
+
sin
θ
n
∧
.
\boldsymbol{R} = \cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta n^{\wedge}.
R=cosθI+(1−cosθ)nnT+sinθn∧.
-
罗德里格斯公式证明
下图来自维基百科中罗德里格斯公式词条。如图所示,假设存在一个单位向量 k k k,某个向量 v v v以 k k k为旋转轴进行旋转,角度为 Θ \Theta Θ,旋转后的向量为 v r o t v_{rot} vrot。
其中向量 v v v可以分解成垂直于 k k k轴和平行于 k k k轴的两个向量:
v = v ⊥ + v ∥ v = v_{\bot}+ v_{\Vert} v=v⊥+v∥
由点乘的投影几何意义可得:
v ∥ = ( v ⋅ k ) k v_{\Vert} = (v \cdot k)k v∥=(v⋅k)k
由向量减法可得:
v ⊥ = v − v ∥ v_{\bot} = v-v_{\Vert} v⊥=v−v∥
因为旋转过程中,跟旋转轴平行的向量是不改变的,所以:
v r o t ∥ = v ∥ v_{rot \Vert} = v_{\Vert} vrot∥=v∥
为计算方便,将 v r o t ⊥ v_{rot \bot} vrot⊥进行分解:
v r o t ⊥ = a + b v_{rot \bot} = a+b vrot⊥=a+b
示意图如下图所示:
由图中的向量关系经过推导可得:
b
=
cos
θ
v
⊥
;
a
=
sin
θ
k
×
v
b = \cos \theta v_{\bot} \space;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
∥
=
sin
θ
k
×
v
+
cos
θ
v
⊥
+
(
v
⋅
k
)
k
=
s
i
n
θ
k
×
v
+
cos
θ
(
v
−
v
∥
)
+
(
v
⋅
k
)
k
=
s
i
n
θ
k
×
v
+
cos
θ
(
v
−
(
v
⋅
k
)
k
)
+
(
v
⋅
k
)
k
=
cos
θ
v
+
(
1
−
cos
θ
)
(
v
⋅
k
)
k
+
sin
θ
k
×
v
\begin{aligned} v_{rot} &= v_{rot\bot} + v_{rot \Vert} \\ &=a+b+v_{\Vert} \\ &=\sin\theta k \times v + \cos \theta v_{\bot}+ (v\cdot k)k \\ &=sin\theta k \times v + \cos \theta (v-v_{\Vert})+ (v\cdot k)k \\ &=sin\theta k \times v + \cos \theta (v-(v \cdot k)k)+ (v\cdot k)k \\ &=\cos \theta v+(1-\cos\theta)(v \cdot k)k +\sin\theta k \times v \end{aligned}
vrot=vrot⊥+vrot∥=a+b+v∥=sinθk×v+cosθv⊥+(v⋅k)k=sinθk×v+cosθ(v−v∥)+(v⋅k)k=sinθk×v+cosθ(v−(v⋅k)k)+(v⋅k)k=cosθv+(1−cosθ)(v⋅k)k+sinθk×v
以上为罗德里格斯的矢量运算表达式,下面需要将其转化为矩阵表达形式:
k
×
v
可用叉乘矩阵来化简为
K
v
[
(
k
×
v
)
x
(
k
×
v
)
y
(
k
×
v
)
z
]
=
[
k
y
v
z
−
k
x
v
y
k
z
v
x
−
k
x
v
z
k
x
v
y
−
k
y
v
x
]
=
[
0
−
k
z
k
y
k
z
0
−
k
x
−
k
y
k
x
0
]
[
v
x
v
y
v
z
]
k\times v可用叉乘矩阵来化简为Kv\\ \begin{bmatrix} (k\times v)_x \\ (k\times v)_y \\ (k\times v)_z \end{bmatrix}= \begin{bmatrix} k_y v_z - k_x v_y \\ k_z v_x - k_x v_z \\ k_xv_y - k_y v_x \end{bmatrix}= \begin{bmatrix} 0 & -k_z & k_y \\ k_z & 0 & -k_x \\ -k_y & k_x & 0 \end{bmatrix} \begin{bmatrix} v_x \\ v_y \\ v_z \end{bmatrix}
k×v可用叉乘矩阵来化简为Kv⎣
⎡(k×v)x(k×v)y(k×v)z⎦
⎤=⎣
⎡kyvz−kxvykzvx−kxvzkxvy−kyvx⎦
⎤=⎣
⎡0kz−ky−kz0kxky−kx0⎦
⎤⎣
⎡vxvyvz⎦
⎤
所以,
cos
θ
v
+
(
1
−
cos
θ
)
(
v
⋅
k
)
k
+
sin
θ
k
×
v
=
cos
θ
v
+
(
1
−
cos
θ
)
k
k
T
v
+
sin
θ
K
v
=
(
cos
θ
I
+
(
1
−
cos
θ
)
k
k
T
+
sin
θ
k
×
)
v
=
R
v
\begin{aligned} &\cos \theta v+(1-\cos\theta)(v \cdot k)k +\sin\theta k \times v \\ &=\cos \theta v+(1-\cos\theta)kk^Tv+\sin\theta K v \\ &=(\cos\theta \boldsymbol I + (1-\cos \theta)kk^T+\sin\theta k^{\times})v \\ &=Rv \end{aligned}
cosθv+(1−cosθ)(v⋅k)k+sinθk×v=cosθv+(1−cosθ)kkTv+sinθKv=(cosθI+(1−cosθ)kkT+sinθk×)v=Rv
旋转矩阵
R
R
R得证:
R
=
cos
θ
I
+
(
1
−
cos
θ
)
n
n
T
+
sin
θ
n
∧
.
\boldsymbol{R} = \cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta n^{\wedge}.
R=cosθI+(1−cosθ)nnT+sinθn∧.
-
使用罗德里格斯公式证明 R − 1 = R T R^{-1} = R^{T} R−1=RT
证明:
若要证明 R − 1 = R T R^{-1} = R^T R−1=RT,只需证明 R T R = I R^TR = I RTR=I即可,因为 R − 1 R = I R^{-1}R = I R−1R=I
R T = ( cos θ I + ( 1 − cos θ ) n n T + sin θ n ∧ ) T = cos θ I + ( 1 − cos θ ) n n T + sin θ ( n ∧ ) T \begin{aligned} R^T &= (\cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta n^{\wedge})^T \\ &=\cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta (n^{\wedge})^T \end{aligned} RT=(cosθI+(1−cosθ)nnT+sinθn∧)T=cosθI+(1−cosθ)nnT+sinθ(n∧)T
所以可计算 R T R R^TR RTR:
R T R = ( cos θ I + ( 1 − cos θ ) n n T + sin θ ( n ∧ ) T ) ⋅ ( c o s θ I + ( 1 − cos θ ) n n T + sin θ n ∧ ) = ( cos θ ) 2 I + cos θ ( 1 − cos θ ) I n n T + cos θ sin θ I n ∧ + cos θ ( 1 − cos θ ) n n T I + ( 1 − cos θ ) 2 ( n n T ) 2 + sin θ ( 1 − cos θ ) n n T n ∧ + sin θ cos θ n × I + sin θ cos θ ( n ∧ ) T n n T + ( sin θ ) 2 ( n ∧ ) T n ∧ = \begin{aligned} R^T R &=(\cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta (n^{\wedge})^T) \cdot (cos\theta \boldsymbol{I} + (1-\cos\theta)nn^T + \sin\theta n^{\wedge}) \\ &=(\cos\theta)^2 \boldsymbol{I} + \cos\theta(1-\cos\theta)\boldsymbol{I}nn^T + \cos\theta\sin\theta\boldsymbol{I}n^{\wedge} \\ &+\cos\theta(1-\cos\theta)nn^{T}\boldsymbol{I} +(1-\cos\theta)^2(nn^T)^2 + \sin\theta(1-\cos\theta)nn^Tn^{\wedge} \\ &+\sin\theta\cos\theta n\times\boldsymbol{I}+\sin\theta\cos\theta(n^{\wedge})^T nn^T+(\sin\theta)^2(n^{\wedge})^Tn^{\wedge} \\ &= \end{aligned} RTR=(cosθI+(1−cosθ)nnT+sinθ(n∧)T)⋅(cosθI+(1−cosθ)nnT+sinθn∧)=(cosθ)2I+cosθ(1−cosθ)InnT+cosθsinθIn∧+cosθ(1−cosθ)nnTI+(1−cosθ)2(nnT)2+sinθ(1−cosθ)nnTn∧+sinθcosθn×I+sinθcosθ(n∧)TnnT+(sinθ)2(n∧)Tn∧=
暂时没有化简出来
作业后边附正确答案
7. 四元数运算性质的验证
验证 p ′ p^{'} p′必定为虚四元数(实部为零)
证明:
已知 p = [ 0 , x , y , z ] T = [ 0 , v ] T p = \begin{bmatrix}0,x,y,z \end{bmatrix}^T = \begin{bmatrix}0,\bf{v} \end{bmatrix}^T p=[0,x,y,z]T=[0,v]T
假定四元数$q = \begin{bmatrix}s,x,y,z \end{bmatrix}^T $
使用《视觉SLAM十四讲》第二版课本P59页中的公式(跟本次习题第5题中的结果类似),可得:
p
′
=
q
p
q
′
=
q
+
p
+
q
−
1
=
q
+
(
q
−
1
)
⨁
p
=
Q
p
\begin{aligned} p^{'} &= qpq^{'}\\ &=q^{+}p^{+}q^{-1} \\ &=q^{+}(q^{-1})^{\bigoplus} p \\ &=Qp \end{aligned}
p′=qpq′=q+p+q−1=q+(q−1)⨁p=Qp
带入两个符号所对应的矩阵,得:
q
+
(
q
−
1
)
⨁
=
[
s
−
v
T
v
s
I
+
v
∧
]
[
s
v
T
−
v
s
I
+
v
∧
]
=
[
1
0
0
T
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
]
q^{+}(q^{-1})^{\bigoplus}= \begin{bmatrix} s & -v^T \\ v & sI + v^{\wedge} \\ \end{bmatrix} \begin{bmatrix} s & v^T \\ -v & sI + v^{\wedge} \\ \end{bmatrix}= \begin{bmatrix} 1 & \bf{0} \\ \bf{0}^T & vv^T +s^2 I+2sv^{\wedge} + (v^{\wedge})^2 \\ \end{bmatrix}
q+(q−1)⨁=[sv−vTsI+v∧][s−vvTsI+v∧]=[10T0vvT+s2I+2sv∧+(v∧)2]
矩阵
Q
Q
Q为:
Q
=
q
+
(
q
−
1
)
⨁
=
[
1
0
0
T
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
]
Q= q^{+}(q^{-1})^{\bigoplus} \begin{aligned} &= \begin{bmatrix} 1 & \bf{0} \\ \bf{0}^T & vv^T +s^2 I+2sv^{\wedge} + (v^{\wedge})^2 \\ \end{bmatrix} \\ \end{aligned}
Q=q+(q−1)⨁=[10T0vvT+s2I+2sv∧+(v∧)2]
因此,
p
′
=
q
+
(
q
−
1
)
⨁
p
=
[
1
0
0
T
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
]
[
0
v
]
=
[
0
(
v
v
T
+
s
2
I
+
2
s
v
∧
+
(
v
∧
)
2
)
v
]
\begin{aligned} p^{'} &= q^{+}(q^{-1})^{\bigoplus} p \\ &= \begin{bmatrix} 1 & \bf{0} \\ \bf{0}^T & vv^T +s^2 I+2sv^{\wedge} + (v^{\wedge})^2 \\ \end{bmatrix} \begin{bmatrix} 0\\ v \\ \end{bmatrix}\\ &= \begin{bmatrix} 0\\ (vv^T +s^2 I+2sv^{\wedge} + (v^{\wedge})^2 )v \\ \end{bmatrix} \end{aligned}
p′=q+(q−1)⨁p=[10T0vvT+s2I+2sv∧+(v∧)2][0v]=[0(vvT+s2I+2sv∧+(v∧)2)v]
可以看出,旋转后的点
p
′
p^{'}
p′的实部
s
s
s为0,故为纯虚四元数,得证。
8. *熟悉C++11
代码中用到c++11标准的地方:
第15行中 vectoravec {a1, a2, a3};:这里使用了C++11新标准提出的列表初始化vector对象。用花括号括起来的0个或者多个初始元素值被赋给了avec 这个vector对象。
第17行:范围for语句,这是c++11新标准引入的一种更简单的for语句,其语法形式是:
for (declaration: expression)
statement
第17行中auto :auto类型说明符;c++11新标准引入,用它就能让编译器替我们去分析表达式所属的类型。
第16行中的 [](const A&a1, const A&a2) {return a1.index<a2.index;}:lambda表达式,一个lambda表达式表示一个可调用的代码单元。我们可以理解为一个未命名的内联函数。于任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式:
[capture list](parameter list) -> return type {function body}
习题讲解后补充:
2. Eigen矩阵运算
如果矩阵A可逆, A A T AA^T AAT才是正定矩阵。否则只能说明 A A T AA^T AAT为半正定。这里Cholesky分解:llt()(正定矩阵),ldlt()(半正定/半负定)。所以代码里使用ldlt函数比较合理。
6. 使用罗德里格斯公式证明 R − 1 = R T R^{-1} = R^{T} R−1=RT
``
github地址: https://github.com/ximing1998/slam-learning.git
国内gitee地址:https://gitee.com/ximing689/slam-learning.git