我有一個矩陣D,它是m * n,我正在使用公式inv(D'* D)* D'計算僞逆,但它並不是生成的與pinv(D)相同的結果。我需要增量操作所需的術語inv(D'* D)。我的所有準確性取決於inv(D'* D),這是不正確的。有沒有其他方法可以準確地獲取inv(D'* D)?任何人都可以幫助我嗎?手動計算僞逆與matlab中的pinv不一樣
%D是我從一個博客複製的3x4矩陣,僅用於演示目的。其實原來的我也有同樣的問題,因爲它的大小太大,我不能在這裏發佈它。
D = -[1/sqrt(2) 1 1/sqrt(2) 0;0 1/sqrt(2) 1 1/sqrt(2);-1/sqrt(2) 0 1/sqrt(2) 1];
B1 = pinv(D)
B2 = D'*inv(D*D')
B1 =
-0.353553390593274 0.000000000000000 0.353553390593274
-0.375000000000000 -0.176776695296637 0.125000000000000
-0.176776695296637 -0.250000000000000 -0.176776695296637
0.125000000000000 -0.176776695296637 -0.375000000000000
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
1.904842e-017.
B2 =
-0.250000000000000 0 0.500000000000000
-0.500000000000000 0 0
0.250000000000000 -0.500000000000000 0
0 0 -0.750000000000000
我需要inv(D'D)做增量操作。實際上在步驟1的問題中,每當新行被添加到D的最後一個位置時,在步驟2中,D的第一行將被刪除。所以我想使用我在這兩個步驟之前計算出的逆來找到最終的D逆。更確切地說看看這裏:
B = inv(D'*D); % if i can calculate it accurately then further work is as follows
D1 = [D;Lr]; %Lr is last row to be added
BLr = B-((B*Lr'*Lr*B)/(1+Lr*B*Lr')); % Row addition formula
Fr = D1(1,:); % First row to be removed
D2 = removerows(D1,1);
BFr = BLr+ ((BLr*Fr'*Fr*BLr)/(1-Fr*BLr*Fr')); % row deletion formula
B = BFr;
Y = BFr*D2;
該警告不應忽視。考慮到惡劣條件矩陣的逆過程是一種災難。我的建議是:不惜一切代價避免使用inv()函數。這幾乎從來都不是正確的做法。 'pinv()'和反斜槓運算符通常是更好的選擇。 – nispio
你使用什麼算法?我沒有時間去反編譯你的Matlab代碼。此外,第3行和第6行是否可能讀爲「'BLr = B - ((B'* Lr'* Lr * B)/(1 + Lr * B * Lr'));'」和「BFr = BLr +((BLr'* Fr'* Fr * BLr)/(1-Fr * BLr * Fr'));'「(在每個中丟失轉置?B是正方形的,所以矩陣乘法運算仍然可行,但它在當前狀態下似乎是一個不尋常的表述。 – nispio
感謝#nispio。其實我試着去「B =(pinv(D'* D))* D'」,但這個也不是和pinv(D)完全一樣。另一件事是沒有轉置丟失。爲了避免反轉操作,我需要使用B進行D2反轉,這樣可以節省總體時間。在第3行中,我沒有乘以轉置,因爲在這種情況下,BLr是可以產生BFr的元素。在此之後,我做了轉置乘法Y. –