2016-11-09 5 views
3

具体的には、次の2種類のコードで同じSとVの理想を得ることができます。しかし、第2の速度はMatlabの最初の速度よりも通常は速い。誰かが私に理由を教えてもらえますか? さらに、数値的に安定した方法はありますか?おかげさまで 行列の単一ベクトルを得るためのMatlabの 'qr'と 'SVD'の違いは何ですか?

[~,S,V] = svd(B,'econ'); 


[Qc,Rc] = qr(B',0); 
[U,S,~] = svd(Rc,'econ'); 
V = Qc*U; 
+0

これは数学の問題です。 SVDとQRは特異ベクトルを得るより多くのものに使われます。例えば、SVDは 'Ax = B'型の方程式を解くのに共通です。だから、いくつかの特定のもの(私は数学者ではない)SVDとQRは同じ場所に得ることができる、私は仮定 –

+0

それは "Matlab"の違いではない、それは数学の理論の違いです。私はこのドメインの専門家ではありませんが、違いを知るためにこれを読むことができます:http://www.cs.princeton.edu/courses/archive/fall11/cos323/notes/cos323_f11_lecture09_svd.pdf – Eskapp

答えて

2

2番目の方法は高速である必要はありません。ほとんど2乗された行列の場合、速度が遅くなる可能性があります。一例として、ゴラブ-Reinsch SVD-アルゴリズムを考えてみましょう:

その仕事はあなたが(だけSSVまたはSVU)を計算したい出力に依存します。

あなたが必要な作業を前処理いずれかを実行することなくSVを計算したい場合は4mn^2 + 8N^3です。

この前にQR分解を実行する場合、必要な作業量は、ハウスホルダー変換の場合、2/3n^3 + n^2 + 1/3n-2です。 Matrixがほぼ正方形の場合、つまりm = nの場合、Rがまだm x nであるほど多少なりとも得られます。しかしmがnより大きい場合は、Rをn×n行列に減らすことができます(薄いQR分解と呼ばれます)。今度はUSを計算し、あなたのSVDアルゴリズムのために12n^3を追加します。

だからのみSVD:4mn^2 + 8N^3

QRとSVD:(12 + 2/3)N^3 + N^2 + 1/3N-2

しかし、ほとんどのSVD-アルゴリズムはに作業を削減するいくつかの(R-)bidiagonalizations inculde必要があります:あなたはまた、それを作るためにQR、R-bifactorization、その後、SVDを適用することができます2MN^2 + 11nの^ 3

をさらに速くなりますが、それはすべてあなたのマトリックスの寸法に依存します。

MatlabはSVDのLapackライブラリに使用します。正確なランタイムhereを検索することができます。それらは上記のアルゴリズムとほぼ同じです。

これが役に立ちます。

関連する問題