【线性代数】SVD的实现方式

文章目录

说明

奇异值分解(Singular Value Decomposition)简称SVD。
现在很多领域都要用到SVD算法,C++有Eigen库,Matlab有svd()函数可以直接使用,十分方便,有很多人都只了解SVD算法的一些性质,但是却不知道SVD具体是怎么求出来的。本篇博文就给出一种传统的SVD的计算方法,这个过程并没有考虑SVD的效率和速度。但是理解了SVD的计算方法后就方便自己造轮子了。

这个传统的方法其实就是将所给的A矩阵转化成
在这里插入图片描述
的形式。
因此思路也就比较简单了,主要是以下三部:

  • 将A矩阵bi-diagonalization(不知道怎么翻译);
  • QR分解算法迭代;
  • 检测QR分解的矩阵是否符合精度要求,如果符合那么就整理得出结果。

仿真

为了方便这里用MATLAB进行验证,
随机生成一个矩阵:

首先是MATLAB的svd()求解结果如下:

再看本文所给出的算法,所求的结果:

三个矩阵相乘转化为分解前的矩阵结果是:

可以看出和A在精度范围内相同,所以验证了算法的正确性。

应用

这里直接给出wiki中文的内容了。

おすすめ

転載: blog.csdn.net/weixin_44229927/article/details/120576034