参考:
http://blog.csdn.net/taoceg/article/details/40186373
http://blog.csdn.net/zxiong9397/article/details/52710053
SVD出现的缘由
svd函数是对SVD分解的实现,SVD分解即是奇异值分解 (sigular value decomposition,SVD),它 是一种正交矩阵分解法,是最可靠的分解法。和它类似的有特征值分解。但是值得注意的是,特征值分解只能针对方阵,而对于非方阵是无法应用特征值分解的。正如我们了解的,特征值分解是将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法。需要注意只有对可对角化矩阵才可以施以特征分解。正因为特征值分解的局限性,数学家才提出SVD分解来替代特征值分解在非方阵的应用。
什么是SVD分解
在讲述svd函数之前,需要对SVD分解有个简单的了解。对于一个M×N的矩阵A,它的转置矩阵A’为N×M,则A’*A的n个特征值的非负平方根叫做A的奇异值。
对于矩阵A(m*n),存在U(m*m),V(n*n),S(m*n)矩阵,使得A = U*S*V’。
我们对A进行svd分解,则A=USV’,如果rank(A)=r,那么U就为1000*r的矩阵,S为r*r的矩阵,V为1000*r的矩阵。
svd函数的调用形式
[U,S,V]=svd(A)
参数说明:A:要进行SVD分解的矩阵,且A不必为方阵。
概括地说,U、S、V返回SVD的分解的结果;
U:A的奇异向量组成的矩阵,AA’的正交单位特征向量组成U。
S:对角矩阵,对角元素是A的奇异值,非负且按降序排列。
V:A的奇异向量组成的矩阵,A’A的正交单位特征向量组成V。
svds函数
相比svd,svds函数可定制性更强。在返回值上并无太大不同,只是使用svds可以选取若干特征值,而不是像svd那样得到所有的特征值。同样的因为特征值矩阵有变化,那么其对应的特征向量组成的矩阵中特征向量的数目同特征值个数一样。看下面的例子:
[u,d,v]=svds(A,10)将得到最大的10个特征值及其对应的最大特征行向量和特征列向量,
[u,d,v]=svds(A,10,0)将得到最小的10个特征值及其对应的特征行向量和特征列向量,
[u,d,v]=svds(A,10,2)将得到与2最接近的10个特征值及其对应的特征行向量和特征列向量。
svd的使用误区
使用时有几点需要注意,1)svd无法对数据类型为uint8的矩阵求分解;2)区分大小写。
如果A是uint8型的矩阵,那么下面的语句就会报错。
S=svd(A)
解决办法S=svd(double(A))
S=SVD(double(A))
出错原因,SVD不能被调用,区分大小写
解决办法S=svd(double(A))