2013-04-05 93 views
0

这里是我的测试功能:svds不适用于某些矩阵?

  function diff = svdtester() 

      y = rand(500,20); 
      [U,S,V] = svd(y); 

      %{ 
      y = sprand(500,20,.1); 
      [U,S,V] = svds(y); 
      %} 

      diff_mat = y - U*S*V'; 
      diff = mean(abs(diff_mat(:))); 

      end 

有两个非常相似的部分:一个发现一个随机矩阵的SVD,另找到一个随机稀疏矩阵的SVD。无论您选择评论哪一个(现在第二个注释掉),我们计算原始矩阵和SVD分量乘积之间的差异,并返回平均绝对差值。

使用rand/svd时,典型的返回值(平均误差)值大约在8.8e-16,基本为零。使用sprand/svds时,典型的返回值大约为0.07,考虑到稀疏矩阵90%0开始,这是相当糟糕的。

我误解SVD应该如何工作稀疏矩阵,或者是这些函数有问题吗?

回答

6

是的,svds的行为与svd有点不同。根据MATLAB的文档:

[U,S,V] = svds(A,...)返回三个输出参数,如果Am -by- n

Um -by- k与正交列

Sk -by - k对角线

Vn -by- k与正交列

U*S*V'是最接近秩k逼近A

其实平时k会出头约6,所以你会得到,而“粗鲁”近似。为了得到更精确的逼近指定kmin(size(y))

[U, S, V] = svds(y, min(size(y))) 

,你会得到相同的数量级顺序的误差在svd情况。

P.S.此外,MATLAB的文件说:

注意svds是最好的用来找到一个大的稀疏矩阵的奇异值。为了找到这种矩阵的所有奇异值,svd(full(A))通常比svds(A,min(size(A)))表现更好。

+0

WOW ......我们在想这一切的时候怎么可能,我们的矩阵是秩6.我只想说:我觉得愚蠢。感谢您为我们节省了大量时间。 – user1956609 2013-04-06 00:12:47