2012-09-14 248 views
1

因此,使用MATLAB的svds()功能上的一些輸入數據,例如:MATLAB:SVDS()不收斂

[U, S, V, flag] = svds(data, nSVDs, 'L') 

我注意到,從運行到使用相同的數據運行,我會得到完全不同的輸出SVD從運行到運行的大小。當我檢查是否設置了「標誌」時,我發現它是,表明SVD沒有收斂。在這裏,我正常的系統是,如果真的需要收斂,我會做這樣的事情:

flag = 1 
svdOpts = struct('tol', 1e-10, 'maxit', 600, 'disp', 0); 
while flag: 
    if svdOpts.maxit > 1e6 
     error('There''s a real problem here.') 
    end 

    [U, S, V, flag] = svds(data, nSVDs, 'L', svdOpts) 
    svdOpts.maxit = svdOpts.maxit*2 
end 

但是,從我所知道的,當你使用「L」作爲第三個參數,第四個參數被忽略,這意味着我只需要處理它不會收斂的事實?我甚至不確定如何使用'西格馬'論證取代'L'論證。我也試着減少計算出來的SVD數量無濟於事。任何有關這個問題的幫助將不勝感激。

編輯 在跟蹤下面的評論時,我發現問題與我構建數據矩陣的方式有關。原來我不小心倒了一個矩陣,並且輸入了大小(4000x1)而不是(20x200),這是拒絕收斂的。 這不是問題

第二個編輯 如果有人仍然在這之後,我其實是錯誤的,我的數據已經只有融合,因爲我攀登上輸入錯誤。這裏是一個程序來生成數據,因爲我生成它們:

% Generate data for SVD failure to converge 
% Kernel functions 
data_fun1 = @(t, tau)(exp(-t*(1./tau))); 
t = linspace(0, 10, 26)'; 
tau1 = logspace(-1, log10(5), 150); 
k1 = data_fun1(t, tau1); 

gamma = 4257; 
n = 6; 
tau = 0.075; 
A = -(2/3)*(2*pi*gamma)^2*n*tau.^3; 

data_fun2 = @(V, t)exp(A*t*(V.^2)); 
V = linspace(0, 0.4, 29); 
tau3 = logspace(-1, log10(5), 150)'; 
tau3 = tau3*1e-5; 
k2 = data_fun2(V, tau3)'; 

svdOpts = struct('tol', 1e-10, 'maxit', 1e3, 'disp', 0); 
svdOpts2 = svdOpts; 
flag = 1; 
while flag 
    if svdOpts2.maxit > 1e8 
     break 
    end 

    [U1, S1, V1, flag] = svds(k1, length(t), 'L', svdOpts); 
    svdOpts2.maxit = svdOpts2.maxit * 2; 
end 
flag 
% flag == 0 
flag = 1; 

while flag 
    if svdOpts2.maxit > 1e8 
     break 
    end 

    [U2, S2, V2, flag] = svds(k2, length(V), 'L', svdOpts); 
    svdOpts2.maxit = svdOpts2.maxit * 2; 
end 
flag 
% flag == 1 

我也試着讓它跑出來svdOpts2.maxit> 1E9,但跑了所有的週末和從來沒有得到過去4.096e8。任何意見,將不勝感激。

+0

如果它不是太大,你可以發佈'data'矩陣嗎?或者在「svds」收斂的時候出現一些奇異值的情節?這將有助於我們理解您處理的數據類型。 – HerrKaputt

+0

'svd​​s(data,nSVDs,'L',svdOpts)'確定:第三個參數可以是實數或'L'。無論哪種情況,都會讀取第四個參數。 –

+0

請同時發佈'nSVDS,大小(數據),nnz(數據),稀疏(數據)' –

回答

0

您提供的示例失敗,因爲您試圖計算完整的SVD分解svds(A,k),只有在k < min(size(A))時才應使用該分解。我應該加很多更少。

對於您的示例svd()應該使用。

隨着k2計算通過上面的代碼

>> tic, [U2, S2, V2, flag] = svds(k2, length(V), 'L'); toc   
Elapsed time is 0.830326 seconds. 
>> flag 

flag = 

    1 

>> tic, [U2, S2, V2] = svd(k2); toc  
Elapsed time is 0.002851 seconds. 
>> norm(U2*S2*V2'-k2)/norm(k2) 

ans = 

    8.4982e-16 


>> max(max(abs(U2*S2*V2'./k2-1))) 

ans = 

    5.8111e-12 

請記住,一個長方形矩陣A只有min(size(A))奇異值,所以確實你有興趣在計算所有奇異值。如果您對廣場S2感興趣,您應該使用svd(k2, 'econ')