2017-05-24 27 views
1

私は、以下の電力の繰り返ししか知りません。しかし、行と列の両方がかなり大きい場合、巨大な行列A '* Aを作成する必要があります。また、Aは密行列です。次のような繰り返しの方法に代わる方法はありますか?私はkrylov部分空間法について聞いたことがありますが、私はそれに精通していません。どんな場合でも、私は下に述べたものよりも速くする方法を探しています:最も支配的な固有値/特異値を計算する最も速い方法は何ですか?

B = A'*A; % or B = A*A' if it is smaller 
x = B(:,1); % example of starting point, x will have the largest eigenvector 
x = x/norm(x); 
for i = 1:200 
    y = B*x; 
    y = y/norm(y); 
    % norm(x - y); % <- residual, you can try to use it to stop iteration 
    x = y; 
end; 
n3 = sqrt(mean(B*x./x)) % translate eigenvalue of B to singular value of A 
+0

'eigs(B、1)'を試しましたか? –

答えて

1

私は100 * 100ランダムに生成されたマトリックスを使ってMATLABの「SVD」コマンドをチェックします。それはあなたのコードよりもほぼ5倍高速です。

s = svd(A); 
n3 = s(1); 
+0

ランダム化されたsvdがトリックを行うように見えます – user3086871

関連する問題