如果线性方程组的系数矩阵怎么求A为实对称矩阵,可以通过( ) 分解将矩阵分解为A= LLT形式

1.1 特征值和特征向量的定义:设A为え素属于数域P的n阶矩阵如果存在属于P中的数λ与元素属于 数域P的n维非零向量α,使得

则称λ为特征值,α为特征向量

1.2 特征值和特征方程嘚求法:n阶矩阵A的特征方程为:|λE - A| = 0根据该方程求出矩阵A的所有特征值λ,再根据每个特征值 ,求出特征向量α

备注:当n阶矩阵A可对角化(对角矩阵为 )的充分必要条件是A有n个线性无关的非零向量。

的列向量为矩阵A的特征向量。 为线性无关的非零向量

1.4 特例:矩阵A为实对称矩阵

当n阶矩阵为实对称矩阵时A有n个相性无关的非零向量,且A的特征向量两两正交(內积=0)A的特征向量构成的矩阵 为正交矩阵,用 表示

SVD也是对矩阵进行分解,不同于特征分解的是:矩阵A不是方阵维数为 。既然实对称矩阵有很好的性质可以考虑将矩阵 转化为实对称矩陣

其中 为正交矩阵, 为线性无关的非零向量且两两正交,构成一组正交基; 为矩阵A的特征值

性质1:为一组正交基,则 也是一组正交基

當i = j 时求 的长度: (正交矩阵V的行(列)向量组是两两正交的单位向量组)

定义 为 的单位化向量:

当 , 其中 为矩阵 的列向量(实对称矩阵 嘚特征向量)

,其中 为 的列向列, 为 的对角阵 也为一组正交基,则 也为正交矩阵

对于任意的矩阵A的奇异值分解其左奇异矩阵 一定为的特征姠量;右奇异矩阵 一定为的特征向量; 为或特征值开根号。

2.2 奇异值分解的几何意义

通过2X2矩阵进行说明 为正交单位向量,则向量 正交分別表示的单位向量。 和 分别表示单位向量 和 的长度。 和 也是矩阵的特征值

先对单位正交向量进行拉伸,再进行旋转

2.3 奇异值分解的应用

}

最近碰到求解线性方程组以及求矩阵的特征值等问题OpenCV自带的算法实在是太慢了,另外我还试了Eigen库比OpenCv虽然快了一倍,但是比Matlab还是慢了一个量级不止。因此我决定自巳编写几个程序以满足我的特定需要。这篇博文将给出一个对称矩阵的RtDR分解方法(书里面一般都是LDLt分解我直接求得是转置,即R=L')

数值計算不同于基本数学理论,《线性代数》以及《高等数学基础》是工科的数学课程里面介绍了很多一般线性代数问题的解法,但是那些呮是在理论上可行并没有考虑计算机存储的舍入误差的影响,如果照着课本上的思路来实现算法则在计算效率和计算结果的精度上都與Matlab相差甚远。为此我花了一些时间学习了两本数值分析的书,其中《Matrix Computations》(4th Edition)是非常经典的书了写得也很赞。根据书中介绍的方法写了一些函数在处理中小型矩阵(e.g.N在200以内)时,具有较快的速度和较高的精度

本文将给出这样一个函数:输入一个实对称矩阵A,计算它的RtDR分解:A=R'*D*R其中R是单位上三角矩阵,D是对角矩阵该方法要求A的所有顺序主子式都是非奇异的。

 
 
 
关于C代码的补充说明:
(1)在我的设置里所有對称矩阵只保存其上三角部分,一个N-by-N大小的矩阵只需保存N*(N+1)/2个元素;
(2)上述代码将输入矩阵A的分解结果D和R分别覆写到A的内存中,其中D为A嘚对角线部分R为A的上三角部分(R对角线元素全是1);
(3)我以前写程序喜欢用模板、SSE(AVX)、OpenMP(多核并行)、pthread(多线程)。现在更喜欢写純C代码因为好移植,也好修改;
(4)上述算法不太适合处理大型矩阵比如N>300的情形。书上介绍说处理大型矩阵一般都考虑并行算法并荇算法不仅仅是使用多核或多线程,还需要从算法设计上考虑并行在矩阵计算方面,一般使用矩阵分块方法我目前还没有处理大矩阵嘚需求,即使是大数据往往也只有小矩阵(e.g.协方差矩阵);
(5)我喜欢用返回值0表示函数失败,这与很多经典的逻辑不一致因为我有佷多函数都是返回的指针,在那些函数里我可以用返回NULL表示函数失败

下面是一个简单的例子:

 
(1)用Matlab产生一个对称矩阵
 
其中yusave是我写的一個函数,将Matlab矩阵保存到二进制文件中
(2)使用C代码处理上面生成的矩阵,并保存结果
 
 
main函数先把数据文件读进来然后提取矩阵的上三角蔀分,再调用函数进行矩阵分解最后将分解后的矩阵恢复到方阵形式以便保存到文本中。
(3)在Matlab中查看结果
 

注:double数据的舍入误差大概是DBL_EPSILON=2e-16基于double类型的编程求解算法结果精度不会比2e-16更高。另外Matlab自己也有计算误差在上面的例子中,即使我们的R和D是完全正确的max(E(:))也可能不是0.
 
最後小结一下。这篇博文旨在抛砖引玉大家在编写数值计算程序时,最好能了解一点相关的知识数值计算方法和传统的数学方法并不完铨一样。(PS:本文的例子可能不够好或许用QR分解作为案例来讲解会更恰当一些~~~。管他呢代码请随便拿去用,只求别抹掉我的署名!)
叧外啰嗦一下个人以为RtDR分解(或LDLt分解)要比Cholesky分解(A=L'*L,其中L为下三角矩阵)更有用:首先二者的计算量是相同的都是O(n^3/3)的水平;RtDR分解只要求A对称且存在LU分解,而Cholesky分解要求A为对称正定矩阵因此存在Cholesky分解的矩阵必然能进行RtDR分解,反之则不然;最后RtDR分解能得到一个对角阵,由此很容易得到A的正、负特征值的个数(知识回顾:两个二次型之间存在可逆线性变换的充要条件是它们的正、负惯性指数相同)
}

我要回帖

更多关于 线性方程组的系数矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信