Schur 補是一種矩陣分解方法,通過將一個大的矩陣分解爲幾個較小的矩陣來簡化計算,通常能夠提高矩陣求逆的速度。
對於形如下面的矩陣:
可以把矩陣劃分爲左上、右上、左下、右下四個分塊矩陣。
得到矩陣:
根據A和D的奇異性,可以分兩種情況。
如果A可逆,則有:
如果D可逆,則有:
公式兩邊同時求逆,得到下面兩組公式:
如果A可逆,則有:
如果D可逆,則有:
根據上述公式,就能求出原始矩陣的逆。
下面的矩陣就是之前介紹BA中的H矩陣,當時直接inv求逆了,這裏用Schur補求逆。
matlab代碼如下:
clear all;close all;clc; load H.mat spy(H); n = length(H); m = 12; A = H(1:m,1:m); B = H(1:m,m+1:end); C = H(m+1:end,1:m); D = H(m+1:end,m+1:end); if det(A)~=0 A_inv = inv(A); U = [eye(m) -A_inv*B;zeros(n-m,m) eye(n-m)]; V = [A_inv zeros(m,n-m);zeros(n-m,m) inv(D-C*A_inv*B)]; W = [eye(m) zeros(m,n-m);-C*A_inv eye(n-m)]; H_inv= U*V*W; else D_inv = inv(D); U = [eye(m) zeros(m,n-m);-D_inv*C eye(n-m)]; V = [inv(A-B*D_inv*C) zeros(m,n-m);zeros(n-m,m) inv(D)]; W = [eye(m) -B*D_inv; zeros(n-m,m) eye(n-m)]; H_inv= U*V*W; end dif = inv(H) - H_inv; sum(dif(:))