a = [1 2 3
2 4 6
3 6 9];
b = pinv(a);
[U,S,V] = svd(a);
T = S;
T(find(S~=0)) = 1./S(find(S~=0));
svda = V * T' * U';
我發現pinvMatlab中的方法使用SVD分解來計算偽逆,所以我嘗試求解矩陣a。
而且如上圖,理論上b應該等于 svda為什么?
b是
0.00510204081632653 0.0102040816326531 0.0153061224489796
0.0102040816326531 0.0204081632653061 0.0306122448979592
0.0153061224489796 0.0306122448979592 0.0459183673469388
svda是
-2.25000000000000 -5.69876639328585e 15 3.79917759552390e 15
-2.14021397132170e 15 1.33712246709292e 16 -8.20074512351222e 15
1.42680931421447e 15 -7.01456098285751e 15 4.20077088383351e 15
如何pinv得到它的結果?
原因:
感謝 Cris,我檢查了我的 S,它確實有 2 個非常大的數字,這就是這個奇怪結果的來源。
小號:
14.0000000000000 0 0
0 1.00758232556386e-15 0
0 0 5.23113446604828e-17
通過 pinv 方法和 Cris 方法,后面的 2 個數字應該設定為 0,而我沒有這樣做。所以這就是原因。
uj5u.com熱心網友回復:
pinv不僅反轉 的所有非零值S,它還首先洗掉所有接近零的值。從檔案中:
pinv(A,TOL)將所有A小于零的奇異值TOL視為零。默認情況下,TOL = max(size(A)) * eps(norm(A)).
pinv或多或少這樣做:
[U,S,V] = svd(a);
I = find(abs(S) > max(size(a)) * eps(norm(a)));
T = zeros(size(S));
T(I) = 1 ./ S(I);
svda = V * T.' * U';
在我的機器上,isequal(svda,b)這是真的,這有點巧合,因為我們在這里所做的操作與 所做的操作并不完全相同pinv,并且您可以預期舍入誤差會有所不同。您可以通過在 MATLAB 中輸入來查看pinv確切的操作。edit pinv這是一個很短的功能。
注意我用過T.',不是T'。前者是轉置,后者是復共軛轉置(Hermitian transpose)。我們在這里處理的是實值矩陣,所以在這種情況下沒有什么區別,但使用正確的運算子很重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517943.html
標籤:matlab矩阵svd逆
