第二节课习题
2.熟悉Eigen矩阵运算

设线性方程Ax = b,在A 为方阵的前提下,请回答以下问题:
在什么条件下,x 有解且唯一?



高斯消元法的原理是什么?
通过初等行变换将增广矩阵转化为行阶梯型矩阵,最后再将得到的行阶梯型矩阵还原为线性方程组求出原方程组的解。从下边的例子可以看出方程组中每个方程含有的未知数的个数降到最低,并且最下面的方程含有的未知数的个数最少。
例:利用高斯消元法求解方程组




3.QR 分解的原理是什么?
参考资料:https://blog.csdn.net/u010945683/article/details/45972819
https://zhuanlan.zhihu.com/p/84415000
首先,QR分解的定义:



计算QR分解一共有三种方法:
Gram-Schmidt Orthogonalization (也就是常说的施密特正交化)
Householder Triangularization
Givens Rotations
QR分解原理:
QR矩阵分解,就是将任意一个满秩矩阵可以分解成一个列向量正交矩阵Q QQ与一个上三角矩阵R RR的积,即A = Q R A = QRA=QR。以施密特正交化方法为例,原理是利用正交投影的思想,将矩阵每个列作为一个基本单元,将其转化为正交的基向量与在这个基向量上的投影长度的积。这一过程的具体介绍可参考https://blog.csdn.net/u010945683/article/details/45972819,讲的非常详细。
4.Cholesky 分解的原理是什么?
Cholesky分解定理:



Cholesky 分解是将一个实对称正定矩阵分解成一个下三角矩阵与其共轭转置的乘积。



5.编程实现A为100×100随机矩阵时,用QR和Cholesky分解求x的程序。你可以参考本次课
用到的useEigen 例程。
代码说明:
若使用Cholesky分解,矩阵需要满足为正定矩阵,也就是


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.矩阵论基础
1.什么是正定矩阵和半正定矩阵?
参考博客:https://zhuanlan.zhihu.com/p/44860862
在学习矩阵论或者线性代数等数学课程时,我们都会学习到正定矩阵和半正定矩阵的知识。半正定矩阵的定义其实是包括正定矩阵的。在不考虑由复数构成的矩阵的话,正定矩阵和半正定矩阵的定义是很简单的:
正定矩阵:给定一个大小为n×n的实对称矩阵A,若对于任意长度为n的非零向量x,

恒成立,则矩阵A是一个正定矩阵。
半正定矩阵:给定一个大小为n×n的实对称矩阵A,若对于任意长度为n的向量x,有

恒成立,则矩阵A AA是一个正定矩阵。
对于方阵A,它的特征值是什么?特征向量是什么?特征值一定是实数吗?如何计算一个矩阵的
特征值?
参考资料:
https://zhuanlan.zhihu.com/p/104980382
https://zhuanlan.zhihu.com/p/95836870


对于做算法的人来说,相比于使用code来计算矩阵的特征值和特征向量,深入理解这两个概念和几何意义更为重要。因为在机器学习领域经常会用到这两者进行降维处理。矩阵的特征值和特征向量的定义如下:
假设我们有一个n阶的矩阵A AA以及一个实数λ,使得我们可以找到一个非零向量x,满足:
Ax=λx
如果能找到这样的值的话,我们就称λ是矩阵A的特征值,非零向量x是矩阵的特征向量。
几何意义:单从定义来看很难直观的理解这两个概念,下面我将结合矩阵变换的几何意义来介绍这两个概念。对于一个n维的向量x来说,如果我们给它乘上一个n阶的方阵A,得到Ax。从几何角度来说,是对向量x进行了一个线性变换。变换之后得到的向量y(也就是Ax)和原向量x的方向和长度都发生了改变。
但对于一个特定的矩阵A来说,总存在一些特定方向的向量x,使得Ax和x的方向没有发生变化,只是长度发生了变化。我们令这个长度发生的变化当做是系数λ,那么对于这样的向量x就称为是矩阵A的特征向量,λ就是这个特征向量对应的特殊值,也就是矩阵A的特征值



以上图中经过错切变换的蒙娜丽莎为例,可以将蒙娜丽莎原图简化成一个2×2的方阵,经过变换这幅图在水平方向上的相对位置是没有改变的(比如俩眼睛之间的距离没变化吧)


特征值一定是实数吗?
实矩阵的特征值不一定都是实数,只有实对称矩阵的特征值才保证是实数。另外复矩阵的特征值也可能有实数。


计算矩阵的特征值
由定义可做如下变形:
Ax=λx⟶(x−λI)x=0
如果上述式子有非零解,那么A−λI是奇异的,也就是行列式为零。因此我们可以通过下式求出特征值:
det(A−λI)=0
然后,针对每个特征值,再通过求解(A−λI)x=0 来找到特征向量。
3.什么是矩阵的相似性?相似性反映了什么几何意义?
相似矩阵定义:
设A,B为n阶矩阵,如果有n阶可逆矩阵P存在,使得



则称矩阵A与B相似,记为A∼B。
这里推荐先看一下这篇解说就更容易理解下边这句话了:https://zhuanlan.zhihu.com/p/151231495
相似矩阵的本质就是,相似的矩阵是同一个线性变换在不同基/坐标系下的的不同描述。同一个运动过程(线性变换)在不同坐标系(不同基)中的表示矩阵(相似矩阵)虽然不一样,但实质上是指的同一个线性变换。
从机器人坐标变换的角度探究相似矩阵的几何意义:


坐标和变换的定义:



通过某一旋转变换,该点到达新的位置,点的坐标在坐标系

该旋转变换,在两个坐标系下分别为A和B。
坐标变换关系


推导



这块在网上搜到了下边这篇文章,从定义到推导,简单明了的说明了在机器人坐标变换角度中矩阵相似的几何意义。https://blog.csdn.net/zhpfeng10/article/details/108977526
4.矩阵一定能对角化吗?什么样的矩阵能保证对角化?不能对角化的矩阵能够形成什么样的形式(Jordan
标准形)?


对于一个矩阵来说,不一定存在将其对角化的矩,但是任意一个n×n矩阵如果存在n nn个线性不相关的特征向量,则该矩阵可被对角化。具体原因在这篇文章中说的很明白: https://www.zhihu.com/question/323578684/answer/753474442
若实在不能对角化,可化成Jordan标准型
Jodan型矩阵:为上双对角矩阵,其上对角线的元素为1或0。这种标准型总能够实现,但不一定数值稳定。该标准型是一组“几乎对角的”矩阵。具体形式参考《矩阵分析与应用》张贤达这本书p237页。
5.奇异值分解(SVD)是什么意思?
定义:
SVD的基本公式:




且除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,且已按大小排好序,



一般我们将U UU中的每个特征向量叫做A的左奇异向量;V的列向量即是



一般我们将V VV中的每个特征向量叫做A的右奇异值。



上图可以很形象的看出上面SVD的定义。
6.矩阵的伪逆是什么意思(Pseudo inverse)?莫尔——彭多斯逆是如何定义的?怎么计算一个矩阵的
伪逆?
伪逆矩阵是逆矩阵的广义形式,由于奇异矩阵或者非方阵的矩阵不存在逆矩阵,但可以有伪逆矩阵(或者说是广义逆矩阵)。



莫尔-彭多斯逆(Moore-Penrose广义逆矩阵)





计算矩阵的伪逆

算法核心步骤主要有两步:



更具体计算递推公式在《矩阵分析与应用》张贤达这本书中p95页有详细的介绍。
对于Moore-Penrose逆矩阵的计算方法有两种,这里就不详细说明了,在《矩阵分析与应用》张贤达这本书中p106有完整介绍。
7.a)当b ≠ 0时,也即是求解非齐次线性方程组,有下面三种情况:
如果增广矩阵的阶梯型出现 0=常数,则方程组无解;
如果非零行个数r<方程组未知数的个数n,则方程组有无穷多个解
如果非零行个数r=方程组未知量的个数n,则方程组有唯一解,解就是化简的增广矩阵最后一列。
b)当b=0时,我们希望求x的非零解。请说明如何求解x
当(r<n),原方程有非零解,然后将系数矩阵A化为行最简形矩阵,并写出同解方程组;
选取合适的未知自由量,并取出相应的基本向量组,代入同解方程组,得到原方程组的基础解系,进而写出通解。



c)上述解法的几何意义
之前曾经了解过,齐次线性方程的非零解求解可以用来判断三点是否在同一直线上,或者三点是否均经过某一点的判断。脑子不好使,具体的几何意义我还不能抽象的想象出来。


4. 几何运算练习
1.说明一个激光传感器下的看到的点应该如何计算它的世界坐标。
计算如下公式可得它的世界坐标系,其中,



2.相机传感器观察到自身坐标系下的点pC[0.3, 0.2, 1.2],请计算某一点的激光系下的坐标和世界系下的坐标;

a) 激光系下的坐标,根据下列公式求解:



坐标点为:[0.35, 1.2, -0.02]

b) 世界系下的坐标,根据下列公式求解:


坐标点为:[2.38, -0.13, 0.87]
代码运行结果截图:



具体代码可查看相关代码文件。


5. 旋转的表达



证明:根据《视觉SLAM十四讲》p44页公式






6. 罗德里格斯公式的证明
由于数学功底有限,所以参考了很多材料,最后经过整理,自我消化,然后按照我的理解在下边记录该公式的推导过程。
https://zhuanlan.zhihu.com/p/79061355
https://blog.csdn.net/SKANK911/article/details/90056646
https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
罗德里格斯公式描述了从旋转向量到旋转矩阵的转换关系。设旋转向量长度为θ,方向为n,那么旋转矩阵R为:
下图来自维基百科中罗德里格斯公式词条。如图所示,假设存在一个单位向量k,某个向量v以k kk为旋转轴进行旋转,角度为Θ \ThetaΘ,旋转后的向量为vrot



其中向量v可以分解成垂直于k轴和平行于k轴的两个向量:




由图中的向量关系经过推导可得:b=cosθv⊥;a=sinθk×v
综上可得:



以上为罗德里格斯的矢量运算表达式,下面需要将其转化为矩阵表达形式:



所以,



旋转矩阵R得证:



暂时没有化简出来 作业后边附正确答案


7. 四元数运算性质的验证
验证p′必定为虚四元数(实部为零)
证明:



使用《视觉SLAM十四讲》第二版课本P59页中的公式(跟本次习题第5题中的结果类似),可得:



带入两个符号所对应的矩阵,得:


因此,



可以看出,旋转后的点p ′


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行中的 {return a1.index<a2.index;}:lambda表达式,一个lambda表达式表示一个可调用的代码单元。我们可以理解为一个未命名的内联函数。于任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式:

[capture list](parameter list) -> return type {function body}

**习题讲解后补充:

  1. Eigen矩阵运算**



github地址: https://github.com/ximing1998/slam-learning.git
国内gitee地址:https://gitee.com/ximing689/slam-learning.git