2013-04-05 129 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