@devilogic
2020-05-07T20:11:46.000000Z
字数 3317
阅读 910
我的无人车之路
mymath
矩阵操作使用了著名的C++矩阵库Eigen在其基础之上封装了模板函数,主要是提供两个功能,一个是求矩阵的伪逆矩阵,一个是计算状态空间下连续形式到离散形式的线性变换。源文件在matrix_operations.hpp中,直接包含即可使用,但是在编译程序时,要使用-I
参数包含Eigen的路径。
虽然此库只涉及了两个函数,但是确蕴含了很丰富的线性代数与优化知识,在介绍完模块的基本使用后,后边小节补充了一些关于矩阵的逆以及双线性变换的知识,不是非常系统。其中涉及的几个知识点都有讨论。
函数名 | 说明 |
---|---|
pseudo_inverse (方阵) |
求一方阵的Moore-Penrose伪逆。 |
pseudo_inverse (任意矩阵) |
求一任意矩阵的Moore-Penrose伪逆。 |
continuous_to_discrete (类型模板) |
计算状态空间表示形式的连续形式到离散形式的双线性变换。 |
continuous_to_discrete (以double 类型基础类型的矩阵Matrixd 为参数) |
计算状态空间表示形式的连续形式到离散形式的双线性变换。 |
Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库。这里是官网地址。
不用编译直接包含即可使用,这里就不做太多叙述了。强力推荐。
若存在一个矩阵使得,则称矩阵为非奇异的或可逆的。矩阵称为的乘法逆元。其中。我们将非奇异矩阵的乘法逆元简称为的逆元,并记作。
一个矩阵有逆,首先条件是一个方阵,其次每个向量都是线性无关的。这里列出线性方程组的一些情况。
设非奇异方阵,由于与单位矩阵是行等价的。所以可以通过一系列的线性初等变换得到。
在算法进行之前首先定义两个辅助算法,一个是对矩阵进行排序算法,其次检查矩阵是否为行阶最简型号。
假设函数名为matrix_sort(M)
。采用什么样的排序算法都可以,当两个向量比较时自定义算法,从第列到第列的元素,一个一个元素进行检测直到遇到一个非元素则计数完毕,计数越多则表示当前向量越大,全向量最大排在矩阵的最后一列。
假设函数名为is_row_echelon_form(M)
在调用此函数之前,首先使用matrix_sort
对矩阵进行排序。因为有排序算法的原因,所以从最后一行开始检测,如果是全行则检测它的上一行,如果不是全行则检测当前行的倒数第二列是否是,如果是则说明是行最简型的。
目标矩阵为一个的矩阵。
matrix_sort(M)
函数对目标矩阵进行排序。目的是将首变量为非的行排在前面。is_row_echelon_form(M)
判断当前矩阵是否是一个行阶段梯形矩阵,如果是则退出,不是则继续流程3。一个超定线性方程组的解一般可以化为最小二乘问题。给定一个的方程组,其中,一般我们不能期望找到一个向量,使得等于。事实上,可以寻找一个向量,使得最接近。
给定一个方程组,其中为一个()矩阵,并且,则对每一,可以构造一个残差。
考虑方程。这个方程出现在很多线性代数的应用问题中。如果方程有非零解,则称为的特征值,且称为属于的特征向量。一般地,我们可以将特征值看成与线性变换相关联的自然频率。若为一矩阵,则可将看成一个上的线性算子。
很多应用问题都涉及将一个线性变换重复作用到一个向量上。求解这类问题的关键是针对算子选择一个在某种意义下很自然的坐标系或基,并使得包含该算子的计算得以简化。对应于这一组新的基向量(特征向量),我们关联一个缩放因子(特征值)表示该算子的自然频率。
我们设一的矩阵, ,我们反复应用到上。,最后这个稳定下来保持不变,那么这个向量成为这个过程的稳态向量。线性算子只是将向量缩小或扩大了倍而已,所以将这个倍数提取出来为,向量