消去變換的定義
消去變換實際上是Gauss-Jordan消去變換(G-J消去變換)的一種緊湊寫法,它可以由兩步完成,一步是G-J消去變換,另一步是替換,具體更多內容可見高慧璇著的《統計計算》,它的一個更貼近於代碼實現的定義如下圖所示
可以看到,這個變換很容易實現,只需要就4種不同情況分別定義好相應取值即可,下面是matlab中消去變換的實現
function B = Tij(A,i,j) [m,n] = size(A); B = zeros(m,n); % case 1 B(i,j) = 1/A(i,j); % case 2 for k = [1:i-1 i+1:m] B(k,j) = -1*A(k,j)/A(i,j); end % case 3 for k = [1:j-1 j+1:n] B(i,k) = A(i,k)/A(i,j); end % case 4 for k = [1:i-1 i+1:m] for s = [1:j-1 j+1:n] B(k,s) = A(k,s) - A(k,j)*A(i,s)/A(i,j); end end end
選主元法求逆算法
按行選主元法求逆算法具體流程如下圖所示,它的證明可以通過置換(可以分解為對換的乘積:$(i_1,i_2,\cdots,i_n)=(i_1\ i_2)(i_2\ i_3)\cdots(i_{n-1}\ i_n)$,從右往左的置換)以及消去變換的性質得到
下面是matlab中的實現
function B = inv_by_Tij(A) [~,n] = size(A); B = zeros(n); C = 1:n; L = zeros(1,n); for i = 1:n [~,j] = max(A(i,C)); A = Tij(A,i,C(j)); L(i) = C(j); C(C==C(j)) = []; end for i = 1:n for j = 1:n B(L(i),j) = A(i,L(j)); end end end
總結
消去變換是一種非常有用的方法,其本質仍然是高斯消去變換,不過這種緊湊的“原地求逆”變換一方面節省了存儲空間,另一方面也使得它在處理某些問題時會顯得非常方便